我是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.
显然,这是一个虚拟脚本。我已经继承了别人的冗长而复杂的脚本,该脚本正在我们的服务器上运行,但是我想在本地进行开发,而不必遍历整个脚本并将所有默认变量调用重新分配给另一个变量。无论我尝试了什么(包括“use v5.10;”),什么都不允许我在本地计算机上使用默认变量。
有任何想法吗?非常感谢您的帮助。
请您参考如下方法:
它不是平台,而是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";