3進演算子で使用しているif-else
ステートメントを置き換えると、コードを実行しようとするとコンパイルエラーが発生することに気付きました。私は犯人がforeach()
ループだと信じています。if-else
です。この場合、三項演算子がif-else構造と同じように動作していない理由を知っていますか?三項演算子はiterative演算子を許可しませんが、if-elseは実行しますか?
私のコードは、食料品のリストで、この
#!/program/perl_v5.6.1/bin/perl5.6.1
use strict;
use warnings;
my $fruits_array_ref = &get_fruits();
if($fruits_array_ref != 0) {
print("$_ is a fruit.\n") foreach(@$fruits_array_ref);
}
else {
print("Maybe you like vegetables?\n");
}
sub get_fruits() {
my @fruit_list;
my $shopping_list = "/home/lr625/grocery_items";
open(my $shopping_list_h, "<", $shopping_list) or die("Couldn't open.\n");
while(my $line = <$shopping_list_h>) {
next if $line =~ /^\#/;
chomp($line);
push(@fruit_list, $line);
}
close($shopping_list_h) or die("Couldn't close.\n");
scalar(@fruit_list) > 0 ? return(\@fruit_list) : return(0);
}
私のデータは
# this is a header
# to my grocery list
apple
banana
grape
orange
のように見えるように私は、main関数で次のように見えるように?:
オペレータとif-else
を交換しています見えます。
my $fruits_array_ref = &get_fruits();
$fruits_array_ref != 0 ? print("$_ is a fruit.\n") foreach(@$fruits_array_ref) : print("Maybe you like vegetables?\n");
また、私のエラーは言います。 test.plライン8で
構文エラーは、test.plの近く ")foreachの"
実行は、コンパイルエラーが原因で中止されました。
これは問題とは関係ありませんが、実際にPerl 5.6.1を使用している場合は、5.18や5.22などの新しいバージョンに更新する必要があります。 5.6は本当に、本当に古いです。しかし、あなたのコードを5.22.1で試してみたところ、同じ結果が得られました。 – PerlDuck
私はしたいと思いますが、私は仕事が私に与えるすべてのものについています。私が得たものとやらなければならない。 @chorobaは、三項演算子のオペランドにコントロール構造を適合させようとしていることをうまく説明しているので、doを使って試してみるか、if-elseの予測可能な振る舞いに従います –
あなたはインフェルノが答えていることを吸収する時間を取ることをお勧めします。あなたは "巧妙な"解決策に近づく危険性があるようであり、メンテナンスは賢明ではありません。 – tjd