2012-03-14 3 views
11

У меня есть заявлениеPerl одна строка, если оператор

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

Но независимо от того, что он всегда устанавливает для "N"

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

Почему не один лайнер, кажется, работает?

+0

@ruakh: Да, но это не изменяет его от '' Y'' до ''N''. –

+0

@KeithThompson: Да, вы правы. OP сказал, что он всегда устанавливает его в «N», но на самом деле все наоборот. – ruakh

+0

О да, это правда. Я забыл, что заменил ответы на их оригиналы. –

ответ

25

Благодаря правилам старшинства, Perl не разбор вашего заявления, как вы думаете :

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

Итак, как вы видите, в обоих случаях, конечный результат является $set скаляр, который затем получает значение Y.

Вы можете исправить это с помощью нескольких скобок:

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

Но зачем повторять назначение:

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

Спасибо, за подробное объяснение моего плохого Perl. Я закончил с 'my $ set = ($ set eq 'Y'? 'N': 'Y');' как в ответе @ Кейта. –

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

должен работать

8

оператора приоритет. То, что вы написали, что эквивалентно

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

Если вы настаиваете на написание такого лаконичный кода, это больше смысла:

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

Речь идет о приоритете; давайте делать намерения с скобкой, а затем пусть Perl удалить их снова:

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 

Который является, таким образом, parenthesing необходимо сделать, как вы хотели.

3

Если вы предпочитаете не использовать «C» в стиле условные операторы, вы можете сделать то же самое с 2-мя линиями:

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

Я лично рекомендовал «C» стиль, описанный выше других ... это легко демонстрирует две опции, которые может быть переменной.

Однако метод, который я показываю, отлично подходит для решения одного условного результата.

Смежные вопросы