我是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"; 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!