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

2ledvvac  于 2022-11-15  发布在  Perl
关注(0)|答案(3)|浏览(152)

该代码触发以下投诉:

#!/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“。我真的没有这个问题的“上下文”,所以我希望你能帮助解释代码的错误。

qyswt5oh

qyswt5oh1#

您正在标量上下文中使用split,而在标量上下文中,它将拆分为@_数组。Perl警告您可能刚刚对@_进行了重敲。(有关详细信息,请参阅perldoc split。)
要获取字段数,请使用以下代码:

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

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

注意:split()的三参数形式是必要的,因为如果不指定限制,split只会分割一部分(比赋值中需要的多一部分)。

w1jd8yoj

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
8wigbo56

8wigbo563#

来自split文档:
在标量上下文中,返回找到的字段数。在标量和void上下文中,它拆分为@_数组。但是,不赞成在标量和void上下文中使用split,因为它会破坏子例程参数。
因此,由于您在标量上下文中使用它,它将拆分为@_数组,这是一种不推荐的用法。(它必须进行拆分,因为它会破坏旧代码,使其预期拆分为@_--据我所知,如果不将其赋值到临时数组中,就无法绕过警告。尤金Y在他的答案中明确指出了这一点。)

相关问题