为什么Perl会抱怨“对@_使用隐式拆分”?

时间:2010-03-12 21:54:33

标签: perl

此代码触发以下投诉:

#!/usr/bin/perl 
use strict;
use warnings;

my $s = "aaa bbb";
my $num_of_item = split(/\s+/, $s) ;
print $num_of_item;

当我运行代码时,Perl会抱怨“Use of implicit split to @_ is deprecated”。 我真的没有问题的“背景”,所以我希望你能帮助解释什么是错的 代码。

3 个答案:

答案 0 :(得分:33)

您在标量上下文中使用split,在标量上下文中,它会分割为@_数组。 Perl警告你,你可能刚刚破坏了@_。 (有关详细信息,请参阅perldoc split。)

要获取字段数,请使用以下代码:

my @items = split(/\s+/, $s);
my $num_of_item = @items;

my $num_of_item = () = split /\s+/, $s, -1;

注意:split()的三参数形式是必要的,因为没有指定限制,拆分只会拆分一个(比需要多一个) 任务)。

答案 1 :(得分:15)

diagnostics提供更多信息:

use strict;
use warnings;
use diagnostics; # comment this out when you are done debugging

my $s = "aaa bbb";
my $num_of_item = split(/\s+/, $s) ;
print $num_of_item;
  

不推荐使用对@_的隐式拆分

     

(D弃用,W语法)它为编译器做了很多工作   你破坏了一个子程序的参数列表,所以如果你分配它会更好   split()的结果显式地表示数组(或列表)。

获取诊断信息的更好方法是从命令行:

perl -Mdiagnostics my_program.pl

答案 2 :(得分:10)

来自split文档:

  

在标量上下文中,返回找到的字段数。在标量和void上下文中,它会分裂为@_数组。但是,不推荐在标量和空间上下文中使用split,因为它会破坏您的子例程参数。

因此,由于您在标量上下文中使用它,它会拆分为@_数组,这是一种不推荐使用的用法。 (它必须进行拆分,因为它会破坏旧代码,期望它分成@_ - 如果没有分配到一个临时数组中就没有办法绕过警告。据我所知。尤金Y明确地说明了这一点。在他的回答中。)