【问题标题】:Does the Perl default variable $_ or @_ behave differently on OS X to linux using split?Perl 默认变量 $_ 或 @_ 在 OS X 和 linux 上使用 split 的行为是否不同?
【发布时间】:2012-03-28 13:14:09
【问题描述】:

我是 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;”),都不允许我在本地机器上使用默认变量。

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

【问题讨论】:

标签: perl cross-platform


【解决方案1】:

不是平台,而是 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";

【讨论】:

  • Correc.t 另请注意,use v5.10 并不意味着“返回 5.10 兼容模式”,而是“需要 5.10 或更高版本”。
  • 但出于好奇,他的主要问题实际上似乎是I would like to develop it locally without having to go through the entire script and reassign all default variable calls to another variable。有没有办法承认这是故意的并抑制警告(仅针对此错误)?
  • 本地安装相同版本的Perl?
  • 感谢您的回复,我已经在本地安装了 5.10 版本,并且运行正常。 @Konerak你是对的,我没有时间去检查并更改对这个脚本中默认变量的所有调用(这是几行) - 更不用说我可能会通过尝试引入的许多错误这样做。在我看来,如果对 perl 进行更新,许多脚本会中断,为什么不推荐使用此功能?
  • 请注意,这是在编译时检测到的,因此perl -c my_script 将打印它出现的所有行。编写一个脚本来读取来自perl -c 的输出并在产生错误的每一行上执行s/split/\@_ = split/ 可能不需要很长时间。
猜你喜欢
  • 2017-10-24
  • 2013-05-04
  • 1970-01-01
  • 2018-11-09
  • 2016-08-14
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 2013-11-21
相关资源
最近更新 更多