我见过perl语句看起来像这样:
() unless $some_var;
Run Code Online (Sandbox Code Playgroud)
那打算实现什么目标?
这里有几件事情,但最重要的是这种线通常会显示为执行块的最后一行[1].在该上下文中,块的值是最后执行的语句的值[2].现在,unless如果右侧为真,则包含左侧的语句,否则为右侧的值,因此这是一种说"块的值$some_var是否$some_var恰好是是的,()否则".
()仅仅是空列表,因此此代码$some_var为假列表的情况提供了空列表的默认值(可能是因为$some_var未定义.)
与or等效物一样,更常见的是达到相同的效果
$some_var or ();
Run Code Online (Sandbox Code Playgroud)
放在一起,我们可以看到这些情况:
use strict;
use warnings;
my @x = do { () unless 0 };
my @y = do { () unless 5 };
print "\@x: <@x>\n\@y: <@y>\n";
Run Code Online (Sandbox Code Playgroud)
@x是空数组因为0是假,而是@y包含5因为5是真的数组.
除了作为块的最后一个语句之外的任何地方() unless $some_var;都是无操作.但是,once如果$some_var没有另外提及,它确实会抑制警告.
[1]:这是通过评估一个块eval或do或提供给(例如)map或grep,或作为子程序调用块.
[2]:"最后执行的语句的值"是一个奇怪的短语; 大多数只有表达式才有值.但是因为Perl包含的概念是,在没有显式返回的情况下,块的值是最后一个语句的值,Perl需要这个奇怪的短语.