首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Perl5.30开始就不再支持$*了

从Perl5.30开始就不再支持$*了
EN

Stack Overflow用户
提问于 2022-02-14 09:09:57
回答 2查看 476关注 0票数 1

我们将从使用perl 5.8.8的旧unix服务器转移到使用Perl 5.32的新服务器。我们有一个脚本,从以下几行开始:

代码语言:javascript
复制
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 $*"",我们得到:

代码语言:javascript
复制
$* is no longer supported as of Perl 5.30 at /usr/local/ccmngr/bin/check_log.pl line 12. 

如果我将$*eval行中删除,我们将得到$[ = 1;行的以下内容

代码语言:javascript
复制
Assigning non-zero to $[ is no longer possible at /usr/local/ccmngr/bin/check_log.pl line 20.

如果任何人有一个想法,并愿意分享,这将是很大的帮助。

EN

回答 2

Stack Overflow用户

发布于 2022-02-14 14:49:18

让我们先看以下几行:

代码语言:javascript
复制
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

除非您在某个奇怪的古老机器上运行此脚本,否则可以将这些行替换为

代码语言:javascript
复制
#!/usr/bin/perl

不再支持$[

  • 5.12 (2010年):不赞成派往$[
  • 5.16 (2012年):除非使用$[,否则将禁用对use feature 'array_base';的分配。
  • 5.16 (2012年):$[的赋值现在只影响当前的词法范围。
  • 5.28 (2018年):发布说明警告称,$[的任务将在5.30中删除。
  • 5.30 (2019年):取消了对$[ (和use feature 'array_base';)的分配。

已经发出了大量的警告。您需要将代码转换为基于0的数组。

同时,这里有两个解决办法,您可以使用。

解决方案1

替换

代码语言:javascript
复制
$[ = 1;

使用

代码语言:javascript
复制
use Array::Base +1;

我认为这是暂时的解决办法。我不会依靠这个来继续工作。

解决方案2

安装Perl5.28(或更早版本,例如使用perlbrew),并替换

代码语言:javascript
复制
$[ = 1;

使用

代码语言:javascript
复制
# ***** WARNING: THIS STOPS WORKING IN PERL 5.30 *****
no warnings qw( deprecated );
use feature qw( array_base );
$[ = 1;
use warnings qw( deprecated );

同样,这只是为您争取时间来调整您的程序使用0基础的数组.

票数 5
EN

Stack Overflow用户

发布于 2022-02-14 10:19:02

如果您有用Perl编写的重要代码,那么您不应该使用系统Perl来运行它--正如您已经看到的,这会阻止您升级操作系统。

相反,您应该有自己的Perl安装,这是一个已知的版本,可以使用您的代码。perlbrew是一种方便的工具。

(但是,是的,您也应该考虑使用不太老的代码!)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71109401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档