6

有一个更好的方法吗?我正在尝试根据标量的值构建 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;

有和没有括号,但不行。

错误是:

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

3 回答 3

13

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

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

从 5.14 开始,诸如 push experimentally 之类的内置函数可以采用任意硬引用,所以这样可以:

push $s eq 'YES' ? \@x : \@y, $r;
于 2013-01-21T19:55:38.167 回答
9
push @{ $s eq 'YES' ? \@x : \@y }, $r;

push真的很想得到一个数组作为它的第一个参数,但你仍然可以通过使用引用来动态选择目标。

于 2013-01-21T19:55:51.857 回答
1

我的首选解决方案是

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

只是风格的东西。使用三元表达式作为 push 的第一个参数对我来说看起来很乱,而且我不介意额外的行。个人口味我猜!

于 2013-01-22T08:37:33.107 回答