除非 - 和“if!”的不同行为如何?语句在标量上下文中影响范围运算符?

时间:2010-03-07 09:45:00

标签: perl operator-precedence associativity

http://novosial.org/perl/one-liner/我找到了以下两个单行。输出不同,因为unless语句与if !不同(由于关联性和优先级规则)。

cat file:  
foo  



bar  
perl -ne 'print unless /^$/../^$/' file  
foo  
bar  
perl -ne 'print if ! /^$/../^$/' file  
foo  

bar  

if !语句的不同行为如何使第二个单行输出成为空行?

3 个答案:

答案 0 :(得分:6)

正如链接文章所说,这是一个关联性和优先性的问题......

print unless /^$/../^$/相当于print if !(/^$/../^$/)

print if ! /^$/../^$/相当于print if (!/^$/)../^$/

请注意,第一个否定范围表达式,而第二个否定范围的开始条件,但不是范围本身。

答案 1 :(得分:4)

答案是,恕我直言,Perl中没有if !语句:有一个if语句,并且有一个!运算符。 !运算符未绑定到if;它根据其论点运作。如果你开始用这些术语思考,你的生活会更容易。

所以,在你的情况下,你有,

do_something() unless something;

do_something() if something-else;

让我们放入通常不可见的括号:

do_something() unless ( something );

do_something() if ( something-else );

在这种情况下,您尝试编写something-else,以便该条件的真值等同于something的真值,但未考虑!的事实操作员紧紧束缚。

这就是not

的原因

尝试

perl -ne 'print if not /^$/../^$/' file  

请参阅not in perldoc perlop

  

一元not返回表达式右侧的逻辑否定。除了优先级非常低之外,它相当于!

答案 2 :(得分:1)

范围测试将返回true,直到第二个操作数为真。然后在下次通话时返回false。

此片段告诉我们范围运算符返回的内容

perl -ne "$x= ( ! /^$/../^$/ ) ; print qq/$x : $_/" range_test.TXT

产生

1 : foo
2E0 :
 :
 :
1 : bar

所以第一个空白行生成一个真实的响应,下一个空白行