Perl Split with array 导致未初始化的值

Perl Split with array results in uninitialized value

我在两台不同的机器(Redhat 和 SUSE)上有相同的 Perl 脚本 运行。在 SUSE 上,脚本运行良好,但在 Redhat 上运行不正常。 这是我 运行 的整个脚本:

#!/usr/bin/perl
$str = "Cat|Dog|Bird"; 
$number = split /\|/, $str;
$type = @_[0];
print "number of args: $number and type is: $type \n";

我得到 2 个不同的输出

SUSE:

number of args: 3 and type is: Cat

红帽:

number of args: 3 and type is: 

我想知道是什么原因造成的???在第一个 $type 中以某种方式初始化

注意:我忽略了警告 "Scalar value @_[0] better written as $_[0]",因为即使我更改它也没有任何区别。输出将是相同的。

documentation for split有这个

Prior to Perl 5.11, it also overwrote @_ with the list in void and scalar context. If you target old perls, beware.

随后的第一个 稳定版本 是 v5.12,此后 split 如果在标量上下文中调用则不再覆盖 @_:列表fields 被简单地丢弃,但仍然返回 number 个字段。 (请注意,因此在 void 上下文中调用 split 是完全无效的:列表及其大小都不会保存在任何地方。)它以前会覆盖当前子例程的参数,所以这是一个非常糟糕的主意

您的代码应如下所示

my $str    = 'Cat|Dog|Bird';
my @fields = split /\|/, $str;
my $number = @fields;
my $type   = $fields[0];

print "number of args: $number and type is: $type \n";

这将在所有版本的 Perl 上正常工作