我知道 Perl 提供了三种基本上下文:标量、列表和空。在函数内部,您可以像这样使用wantarray定义要调用的代码的上下文。
return unless defined wantarray; # don't bother doing more
my @a = complex_calculation();
return wantarray ? @a : "@a";
此外,还有一个标量上下文的特殊亚种——逻辑(在if或grep条件中找到)。以及如何确定我的函数是在这样的逻辑上下文中调用的?在这种情况下,我可以优化计算。
这是一个很好的例子。有一种方法可以从数据库中计算表中的行数。它可以简单地用于查看该表中是否有任何行。很明显,如果这样调用该方法,那么扫描整个表是没有意义的,可以停在第一个合适的行。
unless (логический контекст) {
sql("SELECT count(*) FROM test_table WHERE some_colum > 42");
} else {
sql("SELECT EXISTS (SELECT 1 FROM test_table WHERE some_colum > 42)");
}
使用Want模块,它可以确定当前上下文的所有细微之处。