我們正在從帶有 perl 5.8.8 的舊 unix 服務器遷移到帶有 Perl 5.32 的新服務器。我們有一個以以下行開頭的腳本:
eval "exec /usr/local/bin/perl -S $0 $*"
if $running_under_some_shell;
# this emulates #! processing on NIH machines.
# (remove #! line above if indigestible)
eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_] =)(.*)/ && shift;
# process any FOO=bar switches
$[ = 1; # set array base to 1
$, = ' '; # set output field separator
$\ = "\n"; # set output record separator
腳本不起作用。對于"eval "exec /usr/local/bin/perl -S $0 $*""我們得到的行:
$* is no longer supported as of Perl 5.30 at /usr/local/ccmngr/bin/check_log.pl line 12.
如果我洗掉$*fromeval行,我們會得到以下行$[ = 1;:
Assigning non-zero to $[ is no longer possible at /usr/local/ccmngr/bin/check_log.pl line 20.
如果有人有想法并愿意分享,那將是很大的幫助。
uj5u.com熱心網友回復:
這兩個應該已經有一段時間沒有使用了。
與 的使用相關$*,perlrun for-S解釋了其復雜的用法和基本原理。簡而言之,
通常這用于
#!在不支持的平臺上模擬啟動#!。
所以我首先嘗試擺脫那條線,因為它的原因可能完全是歷史性的,并使用正常的#!/path-to-perl;(似乎是#!/usr/local/bin/perl;),或者如果你需要觸發你路徑中第一個 Perl 版本(似乎并非如此)使用/usr/bin/env. 請參閱鏈接的檔案。?
至于$[,perlvar$[說
此變數存盤陣列中第一個元素的索引,以及子字串中第一個字符的索引。默認值為 0,但理論上您可以將其設定為 1 ... 從 Perl v5.16.0 開始,它由
arybase模塊實作。
但是,即使上面的參考來自最新perldoc的 ,arybase也不再可用,既不是 core 也不是 via CPAN。人們總是可以從 CPAN 獲取軟體包(最新版本似乎是 5.28)并安裝它并保持手指交叉......但這并不是很有希望。相反,Array::Base確實存在并且根據其概要作業(在 5.32 上檢查)。
(我真的寧愿推薦在 Perl 腳本中使用基于 0 的陣列,但我不知道在您的程式中更改它是否可行。)
更多,你很可能需要(小心地)返工更多,從 5.8 跳到 5.32。
?可能是編譯器混淆了它$*作為(已洗掉的)正則運算式變數并抱怨它,因為$*它是由cshshell 使用的(所以 perl 不應該有問題)。如果屬實,那可能會以某種方式解決。
但是無論如何,如果這些年后不再需要它,最好將其洗掉。
uj5u.com熱心網友回復:
讓我們先看看以下幾行:
eval "exec /usr/local/bin/perl -S $0 $*"
if $running_under_some_shell;
# this emulates #! processing on NIH machines.
# (remove #! line above if indigestible)
$*不打算由 Perl 使用。如果這個程式由 運行perl,這些行什么都不做,因為$running_under_some_shell是假的。
但如果它是由 shell 運行的,第一行最終會被執行,它的意思是perl執行腳本。這些行用于./script在沒有 shebang ( #!) 支持的機器上作業。
使固定
除非您在一些奇怪的古老機器上運行此腳本,否則您可以通過將這些行替換為
#!/usr/bin/perl
$[不再支持。
- 5.12 (2010):不推薦使用分配給
$[。 - 5.16 (2012): 除非被使用,否則分配給
$[被禁用。use feature 'array_base'; - 5.16 (2012):分配到
$[now 只影響當前的詞法范圍。 - 5.28 (2018):發行說明警告
$[將在 5.30 中洗掉分配給。 - 5.30 (2019):分配給
$[(和use feature 'array_base';) 已被洗掉。
給出了很多警告。您需要將代碼轉換為期望基于 0 的陣列。
同時,您可以使用以下兩種解決方法。
解決方法 1
代替
$[ = 1;
和
use Array::Base 1;
我認為這是一個臨時修復。我不會依靠這個來繼續作業。
解決方法 2
安裝 Perl 5.28(或更早版本,例如使用perlbrew),并替換
$[ = 1;
和
# ***** WARNING: THIS STOPS WORKING IN PERL 5.30 *****
no warnings qw( deprecated );
use feature qw( array_base );
$[ = 1;
use warnings qw( deprecated );
同樣,這只是為您爭取時間來調整程式以使用基于 0 的陣列。
uj5u.com熱心網友回復:
如果您有用 Perl 撰寫的重要代碼,那么您不應該使用系統 Perl 運行它 - 正如您所看到的,這可能會阻止您升級作業系統。
相反,您應該擁有自己的 Perl 安裝,這是一個已知可與您的代碼一起使用的版本。perlbrew是一個方便的工具。
(但是,是的,您還應該考慮使用不那么古老的代碼!)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425535.html
