此代码触发以下投诉:
#!/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
”。
我真的没有问题的“背景”,所以我希望你能帮助解释什么是错的
代码。
答案 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明确地说明了这一点。在他的回答中。)