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;"),任何东西都不允许我在本地机器上使用默认变量.
有任何想法吗?非常感谢帮助.
它不是平台,而是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)
| 归档时间: |
|
| 查看次数: |
271 次 |
| 最近记录: |