该代码触发以下投诉:
#!/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“。我真的没有这个问题的“上下文”,所以我希望你能帮助解释代码的错误。
Use of implicit split to @_ is deprecated
qyswt5oh1#
您正在标量上下文中使用split,而在标量上下文中,它将拆分为@_数组。Perl警告您可能刚刚对@_进行了重敲。(有关详细信息,请参阅perldoc split。)要获取字段数,请使用以下代码:
split
@_
my @items = split(/\s+/, $s); my $num_of_item = @items;
或
my $num_of_item = () = split /\s+/, $s, -1;
注意:split()的三参数形式是必要的,因为如果不指定限制,split只会分割一部分(比赋值中需要的多一部分)。
w1jd8yoj2#
让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
8wigbo563#
来自split文档:在标量上下文中,返回找到的字段数。在标量和void上下文中,它拆分为@_数组。但是,不赞成在标量和void上下文中使用split,因为它会破坏子例程参数。因此,由于您在标量上下文中使用它,它将拆分为@_数组,这是一种不推荐的用法。(它必须进行拆分,因为它会破坏旧代码,使其预期拆分为@_--据我所知,如果不将其赋值到临时数组中,就无法绕过警告。尤金Y在他的答案中明确指出了这一点。)
3条答案
按热度按时间qyswt5oh1#
您正在标量上下文中使用
split
,而在标量上下文中,它将拆分为@_
数组。Perl警告您可能刚刚对@_进行了重敲。(有关详细信息,请参阅perldoc split。)要获取字段数,请使用以下代码:
或
注意:split()的三参数形式是必要的,因为如果不指定限制,split只会分割一部分(比赋值中需要的多一部分)。
w1jd8yoj2#
让diagnostics提供更多信息:
不建议使用对@_的隐式拆分
(D语法已弃用,W语法)当您破坏子例程的参数列表时,会给编译器带来大量工作,因此最好将split()的结果显式赋值给数组(或列表)。
获取诊断信息的更好方法是从命令行:
8wigbo563#
来自split文档:
在标量上下文中,返回找到的字段数。在标量和void上下文中,它拆分为@_数组。但是,不赞成在标量和void上下文中使用split,因为它会破坏子例程参数。
因此,由于您在标量上下文中使用它,它将拆分为
@_
数组,这是一种不推荐的用法。(它必须进行拆分,因为它会破坏旧代码,使其预期拆分为@_
--据我所知,如果不将其赋值到临时数组中,就无法绕过警告。尤金Y在他的答案中明确指出了这一点。)