我们将从使用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. 如果我将$*从eval行中删除,我们将得到$[ = 1;行的以下内容
Assigning non-zero to $[ is no longer possible at /usr/local/ccmngr/bin/check_log.pl line 20.如果任何人有一个想法,并愿意分享,这将是很大的帮助。
发布于 2022-02-14 14:49:18
让我们先看以下几行:
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 (#!)支持的机器上工作。
Fix
除非您在某个奇怪的古老机器上运行此脚本,否则可以将这些行替换为
#!/usr/bin/perl不再支持$[。
$[。$[,否则将禁用对use feature 'array_base';的分配。$[的赋值现在只影响当前的词法范围。$[的任务将在5.30中删除。$[ (和use feature 'array_base';)的分配。已经发出了大量的警告。您需要将代码转换为基于0的数组。
同时,这里有两个解决办法,您可以使用。
解决方案1
替换
$[ = 1;使用
use Array::Base +1;我认为这是暂时的解决办法。我不会依靠这个来继续工作。
解决方案2
安装Perl5.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基础的数组.
发布于 2022-02-14 10:19:02
如果您有用Perl编写的重要代码,那么您不应该使用系统Perl来运行它--正如您已经看到的,这会阻止您升级操作系统。
相反,您应该有自己的Perl安装,这是一个已知的版本,可以使用您的代码。perlbrew是一种方便的工具。
(但是,是的,您也应该考虑使用不太老的代码!)
https://stackoverflow.com/questions/71109401
复制相似问题