2012-03-14 3 views
11

私は声明Perlの1行の文

$set eq "Y" ? $set = "N" : $set = "Y"; 

しかし、それは常に"N"

# Toggle setting 
if ($set eq "Y") 
{ 
    $set = "N"; 
} 
else 
{ 
    $set = "Y"; 
} 

なぜ1つのライナーが動作していないように設定されますどのように関係なく持っている場合は?

+0

@ruakh:はい、「Y」から「N」に変更されません。 –

+0

@KeithThompson:はい、そうです。 OPはそれを常に「N」に設定していると言ったが、実際には正反対である。 – ruakh

+0

ああ、これは本当です。私は答えを元のものに戻して忘れてしまった。 –

答えて

25

あなたが考えるようperlがあなたの文を解析されていない:何が書いたことは、あなたがそのような簡潔なコードを書くことを主張した場合、これはより多くの意味を作る

($set eq "Y" ? $set = "N" : $set) = "Y"; 

に相当します:

$ perl -MO=Deparse,-p -e '$set eq "Y" ? $set = "N" : $set = "Y"' 
((($set eq 'Y') ? ($set = 'N') : $set) = 'Y'); 
-e syntax OK 

だから、あなたが見るように、両方の条件で、最終的な結果は、Yに設定されます$setスカラーです。

あなたは、いくつかの括弧でそれを修正することができます:

$set eq "Y" ? $set = "N" : ($set = "Y") 

しかし、なぜ割り当てを繰り返します

$set = $set eq 'Y' ? 'N' : 'Y'; 
+0

ありがとう、私の悪いPerlについての深い説明のために。 @ Keithの答えのように、 'my $ set =($ set eq 'Y'? 'N': 'Y');で終わった。 –

7
$set = ($set eq "Y") ? "N" : "Y"; 

8

演算子の優先順位を動作するはずです。 、により優先順位ルールに

$set = ($set eq "Y" ? "N" : "Y"); 
5

それが優先さについてです。さんがカッコ意図をやらせ、その後、Perlが再びそれらを削除してみましょう:ので、あなたが意図したとおりに行うために必要parenthesingある

perl -MO=Deparse -e '($set eq "Y") ? ($set = "N") : ($set = "Y"); print $set' 
$set eq 'Y' ? $set = 'N' : ($set = 'Y'); 
print $set; 
-e syntax OK 

を。

3

あなたではなく、「C」スタイル条件文を使用しない場合は、2行で同じことを行うことができます

my $set = "Y"; #Set the scope and default value 
$set = "N" if ($set eq "Y"); 

は私が個人的には上記の他の人が述べた「C」スタイルをお勧めします...それを簡単に変数が可能な2つのオプションを示しています。

しかし、私が示す方法は、単一の条件付き結果を扱う場合には優れています。