3

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

猫文件:  
富  



酒吧  
perl -ne '打印除非 /^$/../^$/' 文件  
富  
酒吧  
perl -ne '打印如果!/^$/../^$/' 文件  
富  

酒吧  

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

4

3 回答 3

6

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

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

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

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

于 2010-03-07T10:47:15.697 回答
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  

参见notperldoc perlop

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

于 2010-03-07T13:12:06.707 回答
1

范围测试将在第二个操作数为真之前返回真。然后它将在下一次调用时返回 false。

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

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

产生

1 : foo
2E0 :
 :
 :
1 : bar

所以第一个空行生成一个真正的响应,下一个是假的

于 2010-03-07T10:59:32.690 回答