Perlについての質問箱 45箱目
■ このスレッドは過去ログ倉庫に格納されています
0451デフォルトの名無しさん
2010/12/13(月) 17:37:12@arrayがあれば@arrayをforeach、なければ@array2をforeachさせたくこういうコードを書きました。
foreach (@array || @array2) {処理;}
その結果、@arrayがない場合はうまく@array2がforeachされたのですが、ある場合には@arrayの要素数が返ってしまいました。
なぜ@arrayがない場合はうまく動くのにある場合はこうなってしまうのでしょうか?
||の仕様で、前方の配列が真だった場合はスカラーとして返し、後方の配列が真だった場合は配列として返す、となっているのでしょうか。
その仮定が正しいのかどうか、こういう風に書いて試してみました。
foreach ((@array && (0 || @array)) || @array2) {処理;}
しかし結果は変わりませんでした。
また、どのように書くのがスマートでしょうか?
今はこのようにしているのですが、参照を取って復元というのはやや微妙です(@array2は実際の所keys %hashです)
my $ref = (@array && \@array) || [keys %hash];
foreach (@$ref) {処理;}
452 :デフォルトの名無しさん [sage] :2010/12/13(月) 17:37:13
>>451
http://perldoc.jp/docs/perl/5.6.1/perlop.pod
|代入のために二つの集合を選択するためには使うべきではない
|@a = @b || @c; # this is wrong
|@a = scalar(@b) || @c; # really meant this
|@a = @b ? @b : @c; # this works fine, though
453 :デフォルトの名無しさん [sage] :2010/12/13(月) 17:37:14
>>452
配列の選択に||を使えう事は出来ず、?を使えば良いのですね。
@arrayと2回書くのは多少あれですが
foreach (@array? @array: keys %hash) {処理;}
とすることにしました。レスありがとうございました。
■ このスレッドは過去ログ倉庫に格納されています