Что не так с этим логическим синтаксисом Perl? - PullRequest
3 голосов
/ 10 марта 2010

У меня есть хак, который мне нужно использовать при следующих условиях:

  • Это последняя страница данных.
  • Это не первая страница.
  • Нет четного количества элементов данных размера страницы.

Итак, я попробовал этот код:

my $use_hack = 
   $last_page_number == $current_page_number and
   $page_number != 1 and
   $total_items % $items_per_page != 0;

И я продолжаю получать это предупреждение Useless use of numeric ne (!=) in void context о последнем условии, и оно оценивается как истинное, когда $total_items % $items_per_page = 0.

say 'NOT EVEN' if $total_items % $items_per_page != 0;  #works properly, though...

Я пробовал различные комбинации скобок, чтобы сделать это правильно, но, похоже, ничего не работает.

Ответы [ 2 ]

14 голосов
/ 10 марта 2010

Хорошо, приоритет оператора. and имеет почти самый низкий приоритет любого оператора в Perl, поэтому Perl вычислял выражение в странном порядке. Переключение на && вместо этого дало мне правильные результаты. Blarg.

Чем больше вы знаете .

EDIT:
Как отметил Филип Поттер ниже, Perl Best Practices (стр.70) рекомендует всегда использовать &&,||, ! для логических условий - ограничение and or и not для потока управления из-за их низкого приоритета. (И даже доходит до того, что никогда не используйте and и not, только or для резервной логики.)
Спасибо всем!

7 голосов
/ 10 марта 2010

Заключите RHS в круглые скобки:

my $use_hack = (
   $last_page_number == $current_page_number and
   $page_number != 1 and
   $total_items % $items_per_page != 0);

Назначение (=) имеет более высокий приоритет по сравнению с оператором and. Вы можете взглянуть на приоритет оператора Perl .

...