在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 !
语句的不同行为如何使第二个单行输出成为空行?
答案 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
返回表达式右侧的逻辑否定。除了优先级非常低之外,它相当于!
。
答案 2 :(得分:1)
范围测试将返回true,直到第二个操作数为真。然后在下次通话时返回false。
此片段告诉我们范围运算符返回的内容
perl -ne "$x= ( ! /^$/../^$/ ) ; print qq/$x : $_/" range_test.TXT
产生
1 : foo
2E0 :
:
:
1 : bar
所以第一个空白行生成一个真实的响应,下一个空白行