使用split,Perl默认变量$ _或@_在OS X到linux上的行为是否有所不同?

rml*_*mlc 2 perl cross-platform

我是Perl的新手,并且长期以来一直在努力寻找这个问题的答案,但我被困住了.

请看以下示例:

my $filein = $ARGV[0];
open(SNPIN,$filein);

while(<SNPIN>)
{
   chomp;
   split(/\s+/);
   print "$_[0]\n";
}

close(SNPIN);
Run Code Online (Sandbox Code Playgroud)

我使用的测试文件包含以下行:

This is a test.
Is a test.
A test.
Run Code Online (Sandbox Code Playgroud)

这个脚本在我们的linux服务器上运行正常(使用perl 5.10),输出每行的第一个单词 - 虽然它给了我以下警告:

Use of implicit split to @_ is deprecated at scan_test.pl line 7.
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在运行OS X的本地机器上执行它(使用perl 5.12.3)时,我收到以下错误:

Useless use of split in void context at scan_test.pl line 7.
Use of uninitialized value $_[0] in concatenation (.) or string at 
scan_test.pl line 8, <SNPIN> line 1.
Run Code Online (Sandbox Code Playgroud)

显然这是一个虚拟脚本.我继承了其他人非常漫长而复杂的脚本,它正在我们的服务器上工作,但我想在本地开发它,而不必遍历整个脚本并将所有默认变量调用重新分配给另一个变量.无论我尝试过什么(包括"使用v5.10;"),任何东西都不允许我在本地机器上使用默认变量.

有任何想法吗?非常感谢帮助.

Ilm*_*nen 7

它不是平台,而是Perl版本.

你在Perl 5.10上发出的警告应该是一个线索:弃用意味着"你不应该使用它,因为它将在以后的版本中停止工作".显然,它确实停止在Perl 5.10和5.12之间的某个地方工作.


要修复它,只需将返回的列表显式分配split到数组中.如果你想继续使用@_,这应该工作:

chomp;
@_ = split(/\s+/);
print "$_[0]\n";
Run Code Online (Sandbox Code Playgroud)

但我真的建议使用自己的命名数组,因为@_它具有特殊含义(它用于将参数传递给子程序):

chomp;
my @items = split(/\s+/);
print "$items[0]\n";
Run Code Online (Sandbox Code Playgroud)

  • Correc.t另请注意,"使用v5.10"并不意味着"返回5.10兼容模式",而是"需要5.10或更高版本". (2认同)
  • 请注意,这是在编译时检测到的,因此`perl -c my_script`将打印它出现的所有行.编写一个脚本来读取`perl -c`的输出并在生成错误的每一行上执行`s/split /\@_ = split /`可能不会花费很长时间. (2认同)