有条件地推送到Perl中的2个阵列中的1个

时间:2013-01-21 19:47:53

标签: perl

有更好的方法吗?我正在尝试根据标量的值构建2个数组:

my (@x, @y);
my $r = [$v1, $v2, $v3];
push @x, $r if $s eq 'YES';
push @y, $r if $s ne 'YES';

我尝试使用:

push $s eq 'YES' ? @x : @y, $r;

有没有parens,但没有去。

错误是:

Type of arg 1 to push must be array (not null operation) at comp_report.pl line 79, near "$r;"

3 个答案:

答案 0 :(得分:13)

push要求它的第一个参数是一个实际的数组(至少在perl 5.14和更早版本之前 - 它可能已经改变了),而不是表达式,所以你需要:

push @{ $s eq 'YES' ? \@x : \@y}, $r;

从5.14开始,内置诸如推送experimentally can take arbitrary hard references,所以这有效:

push $s eq 'YES' ? \@x : \@y, $r;

答案 1 :(得分:9)

push @{ $s eq 'YES' ? \@x : \@y }, $r;

push确实希望将数组作为其第一个参数,但您仍然可以使用引用动态选择目标。

答案 2 :(得分:1)

我首选的解决方案是

if($s eq 'YES'){
   push @x, $r; 
else{
    push @y, $r;
}

只是一种风格的东西。使用三元表达作为推动的第一个参数看起来很麻烦,我不介意额外的行。个人品味我猜!