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

时间:2012-03-28 04:56:42

标签: perl cross-platform

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

采用以下示例:

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

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

close(SNPIN);

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

This is a test.
Is a test.
A test.

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

Use of implicit split to @_ is deprecated at scan_test.pl line 7.

但是当我尝试在运行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.

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

有什么想法吗?非常感谢帮助。

1 个答案:

答案 0 :(得分:7)

这不是平台,而是Perl版本。

你在Perl 5.10上发出的警告应该是一个线索:deprecated表示“你不应该使用它,因为它将在以后的版本中停止工作”。显然,它确实在Perl 5.10和5.12之间停止工作。


要修复它,只需将split返回的列表显式指定为数组即可。如果您想继续使用@_,这应该可行:

chomp;
@_ = split(/\s+/);
print "$_[0]\n";

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

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