这个Perl布尔语法有什么问题?

时间:2010-03-10 04:59:50

标签: perl syntax operator-precedence

我需要在这些条件下使用黑客:

  • 这是数据的最后一页。
  • 这也不是第一页。
  • 没有页数大小偶数的数据项。

所以我尝试了这段代码:

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 个答案:

答案 0 :(得分:14)

好的,运营商优先。 and几乎是Perl中任何运算符的最低优先级,因此Perl以奇怪的顺序评估表达式。切换到&&反而得到了正确的结果。 Blarg。

The More You Know

编辑:
正如Philip Potter在下面指出的那样, Perl最佳实践(p.70)建议始终使用&&,||, !作为布尔条件 - 限制and ornot用于控制流程,因为他们的低优先权。 (它甚至可以说永远不会使用andnot,只有or用于后备逻辑。)
谢谢大家!

答案 1 :(得分:7)

将RHS括在括号中:

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

=运算符相比,赋值(and)具有更高的优先级。您可以查看Perl Operator Precedence