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

Hai*_*ang 26 perl

此代码触发以下投诉:

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

my $s = "aaa bbb";
my $num_of_item = split(/\s+/, $s) ;
print $num_of_item;
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,Perl抱怨" Use of implicit split to @_ is deprecated".我真的没有问题的"背景",所以我希望你能帮助解释代码的错误.

Eug*_*ash 33

您正在split标量上下文中使用,并且在标量上下文中它将分割为@_数组.Perl警告你,你可能刚刚破坏了@_.(有关更多信息,请参阅perldoc拆分.)

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

my @items = split(/\s+/, $s);
my $num_of_item = @items;
Run Code Online (Sandbox Code Playgroud)

要么

my $num_of_item = () = split /\s+/, $s, -1;
Run Code Online (Sandbox Code Playgroud)

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

  • fwiw,如果你不使用`LIMIT`参数并且你的模式没有捕获,那么`split/pattern /,$ str`的​​计数将比`/ pattern /`匹配的次数多一次. $ str`,你可以找到`m // g`匹配而不使用split :) (3认同)
  • @hobbs:实际上,这个行为记录在联机帮助页中:`当分配给列表时,如果省略LIMIT,或者为零,Perl提供的LIMIT大于列表中变量的数量,以避免不必要的工作.默认情况下,空列表LIMIT为1. (2认同)

too*_*lic 15

诊断提供更多信息:

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;
Run Code Online (Sandbox Code Playgroud)

不推荐使用隐式拆分为@_

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

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

perl -Mdiagnostics my_program.pl
Run Code Online (Sandbox Code Playgroud)


Cas*_*bel 10

拆分文档:

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

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