2013-01-21 19 views
6

もっと良い方法がありますか?私はスカラーの値に基づいて、2つのアレイを構築しようとしている:条件付きでPerlで2つの配列の1つに移動する

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;" 
+0

あなたのコードは正しいas_isだと思います。変数を代入する以外に* 3項演算子*を使うのは悪い習慣だと思います(Perl * 3項演算子でできることは*それを実装する他の言語では再現できないことがあります) –

答えて

13

プッシュは、実際の配列(少なくとも前の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; 
+0

+1ちょうど数秒前同じ答え[ここ](http://stackoverflow.com/a/14446203/1337398)。 :) – speakr

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

pushは、最初の引数として配列を取得したいと考えていますが、参照を使用してターゲットを動的に選択することはできます。

1

私の好適な解決策は

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

スタイルだけの事だろう。プッシュする最初の引数として三項式を使用すると、私にとっては面倒なように見え、余分な行は気にしません。私は個人的な味だと思います!

+0

"l-values"と "r-values"を制御することは、あまりにも深くなることなく、私が動的言語で期待するものです。これは、例えば、Lispの一般的なイディオムです。私はPerlがこれで私と戦っているのに驚いて、それが可能かどうか本当に知りたがっていました。 – jeberle

関連する問題