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