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

时间:2018-03-28 16:40:05

标签: perl split scalar

我在两台不同的机器上运行相同的Perl脚本(Redhat& SUSE)。在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以某种方式初始化

注意:我忽略了警告“标量值@_ [0]更好地写为$ _ [0]”,因为如果我更改它没有任何区别。输出将是相同的。

1 个答案:

答案 0 :(得分:6)

documentation for split有此

  

在Perl 5.11之前,它还用void和标量上下文中的列表覆盖@_。如果你的目标是旧的perls,请注意。

第一个后续稳定版本是v5.12,如果在标量上下文中调用它,split将不再覆盖@_:字段列表被简单地丢弃,但仍会返回 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上正常工作