Perl “除非-和”的不同行为如何;如果&引用;语句是否影响标量上下文中的范围运算符?

Perl “除非-和”的不同行为如何;如果&引用;语句是否影响标量上下文中的范围运算符?,perl,operator-precedence,associativity,Perl,Operator Precedence,Associativity,在上,我发现了以下两个一行。输出是不同的,因为除非语句与如果不同(由于关联性和优先规则) cat文件: 福 酒吧 perl-ne“除非打印/^$/../^$/”文件 福 酒吧 perl-ne'如果打印!/^$/../^$/'文件 福 酒吧 if!的不同行为如何-语句使第二个一行输出一个空行?正如链接文章所说,这是一个关联性和优先级的问题 除非打印/^$/../^$/等同于如果打印!(/^$/../^$/) 如果打印!/^$//^$/

在上,我发现了以下两个一行。输出是不同的,因为
除非
语句与
如果不同(由于关联性和优先规则)

cat文件: 福 酒吧 perl-ne“除非打印/^$/../^$/”文件 福 酒吧 perl-ne'如果打印!/^$/../^$/'文件 福 酒吧
if!的不同行为如何-语句使第二个一行输出一个空行?

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

除非打印/^$/../^$/
等同于
如果打印!(/^$/../^$/)

如果打印!/^$//^$/


请注意,第一个运算会对范围表达式求反,而第二个运算会对范围的开始条件求反,但不会对范围本身求反。

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

这段代码告诉我们range操作符返回的内容

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

1 : foo
2E0 :
 :
 :
1 : bar

因此,第一个空行生成一个正确的响应,下一个空行生成一个错误的响应。答案是,IMHO,没有
if语句:有一个
if
语句,还有一个
操作员。
,则code>运算符不绑定到
;它根据自己的论点运作。如果你开始用这些术语思考,你的生活会更轻松

所以,在你的情况下

do_something() unless something;

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

do_something() unless ( something );

在本例中,您试图编写
其他内容
,以便该条件的真值与
内容
的真值相等,但没有考虑到以下事实:
运算符绑定紧密

这就是为什么存在
而不是

试一试

见:

一元
not
返回表达式右侧的逻辑求反。它相当于
除了极低的优先级

1 : foo
2E0 :
 :
 :
1 : bar
do_something() unless something;
do_something() if something-else;
do_something() unless ( something );
do_something() if ( something-else );
perl -ne 'print if not /^$/../^$/' file