Perl为什么抱怨;不推荐使用隐式拆分到@;?

Perl为什么抱怨;不推荐使用隐式拆分到@;?,perl,Perl,此代码触发以下投诉: #!/usr/bin/perl use strict; use warnings; my $s = "aaa bbb"; my $num_of_item = split(/\s+/, $s) ; print $num_of_item; 当我运行代码时,Perl抱怨说“不推荐使用隐式拆分到@u”。 我真的没有这个问题的“背景”,所以我希望你能帮我解释一下这个问题的症结所在 代码。来自文档: 在标量上下文中,返回找到的字段数。在标量和空上下文中,它拆分为@数组。但是,不推

此代码触发以下投诉:

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

my $s = "aaa bbb";
my $num_of_item = split(/\s+/, $s) ;
print $num_of_item;
当我运行代码时,Perl抱怨说“
不推荐使用隐式拆分到@u”。
我真的没有这个问题的“背景”,所以我希望你能帮我解释一下这个问题的症结所在
代码。

来自文档:

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


因此,由于您在标量上下文中使用它,因此它被拆分为
@
数组,这是一种不推荐的用法。(但它必须进行拆分,因为它会将旧代码拆分为
@
——据我所知,如果不将其分配到临时数组,就无法绕过警告。Eugene Y在他的回答中明确指出了这一点。)

您在标量上下文中使用的是
拆分
,在标量上下文中,它拆分为
@
数组。Perl警告您,您可能刚刚撞到@u3;了。(有关详细信息,请参阅。)

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

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

注意:split()的三参数形式是必要的,因为在没有指定限制的情况下,split只会分割出一块(比 作业)。让我们提供更多信息:

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;
不推荐使用隐式拆分到@uu

(D不推荐,W语法)当 您会破坏子例程的参数列表,因此最好是指定 将split()的结果显式添加到数组(或列表)中

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

perl -Mdiagnostics my_program.pl

use diagnostics
在获取您不知道的警告消息时,它是一个真正的培根节约器understand@mobrule:您也可以简单地在
perldoc perldiag
()中查找这些消息以获得更详细的解释。或者为了保持简洁,
my$num_of_item=()=拆分(/\s+/,$s)
@mobrule:您的评论太晚了:-)带有()的方法对我不起作用$num_of_item刚刚被设置为1.fwiw,如果您不使用
LIMIT
参数,并且您的模式没有捕获,
拆分/pattern/,$str
的计数只会比
/pattern/
匹配的次数多一次,您可以使用
m//g
匹配而不使用split:)@hobbs:事实上,这种行为记录在手册页中:
当分配给列表时,如果省略了限制或为零,Perl提供的限制比列表中的变量数大一,以避免不必要的工作。
对于空列表,默认情况下限制为1。您确定必须在此处显示整个错误消息吗?我的perl还告诉我第6行中的问题。由于拆分在第6行,阅读拆分文档可以告诉我第二段中的问题。:)
perl -Mdiagnostics my_program.pl