在http://novosial.org/perl/one-liner/上,我发现了以下两个 one-liners。输出不同,因为unless
语句不同于if !
(由于关联性和优先规则)。
猫文件: 富 酒吧
perl -ne '打印除非 /^$/../^$/' 文件 富 酒吧
perl -ne '打印如果!/^$/../^$/' 文件 富 酒吧
- 语句的不同行为如何if !
使第二个单行输出一个空行?
在http://novosial.org/perl/one-liner/上,我发现了以下两个 one-liners。输出不同,因为unless
语句不同于if !
(由于关联性和优先规则)。
猫文件: 富 酒吧
perl -ne '打印除非 /^$/../^$/' 文件 富 酒吧
perl -ne '打印如果!/^$/../^$/' 文件 富 酒吧
- 语句的不同行为如何if !
使第二个单行输出一个空行?
正如链接文章所说,这是一个关联性和优先级的问题......
print unless /^$/../^$/
相当于print if !(/^$/../^$/)
print if ! /^$/../^$/
相当于print if (!/^$/)../^$/
请注意,第一个否定范围表达式,而第二个否定范围的开始条件,但不是范围本身。
恕我直言,答案是 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
将表达式的逻辑否定返回到其右侧。它相当于!
除了非常低的优先级。
范围测试将在第二个操作数为真之前返回真。然后它将在下一次调用时返回 false。
此片段告诉我们范围运算符返回的内容
perl -ne "$x= ( ! /^$/../^$/ ) ; print qq/$x : $_/" range_test.TXT
产生
1 : foo
2E0 :
:
:
1 : bar
所以第一个空行生成一个真正的响应,下一个是假的