我在两台不同的机器上运行相同的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]”,因为如果我更改它没有任何区别。输出将是相同的。
答案 0 :(得分:6)
在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上正常工作