Perl或条件

Perl或条件,perl,conditional-statements,Perl,Conditional Statements,我有一个代码,其中包含许多类似的条件(工作正常),用于检查其中一个值是否为空,然后我们抛出一条错误消息(所有值都必须填充) 在这种情况下,我需要添加许多其他变量,这使得这行代码有点不可读 我想知道是否有一种更优雅的方式来指定它们,也许是使用某种数组/列表 感谢您使用,您可以执行以下操作: use List::Util qw/any/; ... elsif (any { !$params{$_} } qw/account type sampledate lastpwchange system w

我有一个代码,其中包含许多类似的条件(工作正常),用于检查其中一个值是否为空,然后我们抛出一条错误消息(所有值都必须填充)

在这种情况下,我需要添加许多其他变量,这使得这行代码有点不可读

我想知道是否有一种更优雅的方式来指定它们,也许是使用某种数组/列表

感谢您

使用,您可以执行以下操作:

use List::Util qw/any/;

...
elsif (any { !$params{$_} } qw/account type sampledate lastpwchange system wspass/) {
    print $cgi->header("text/plain"), "some mandatory parameters are missing";
}
请注意,你的表达并不完全检查空;它实际上执行布尔检查,因此值为
0
的参数也会使检查失败。这可能是你想要的,也可能不是你想要的。

你可以用它来做

my %stuff = map { $_ => 1 } qw/ foo bar baz qrr qux asdf hello world /;
$stuff{foo} = 1; # toggle here

my $missing = grep { ! $stuff{$_} } qw/ foo bar baz qrr qux asdf hello world /;
print "missing argument" if $missing;

这可能不适用于OP的问题,但通常
any
grep
快。从文档中可以看出:在条件中使用“grep”的许多情况都可以用“any”代替,因为它可能在第一个真实结果后短路。@Timur Sharland,
grep
在这里最有利于
any
。原因是
any
版本需要两个子程序调用,而
grep
版本不需要任何子程序调用。对
any
的调用和传递给
any
的条件“block”都是子例程调用,而且代价高昂
grep
是一个运算符(不是一个子例程),传递给
grep
的块实际上是一个块(不是一个子例程)。
grep
是最好的解决方案,如果您不想使用任何模块,或者如果您想保留条件选择的所有键(例如,作为错误消息的一部分打印),例如,
my@missing=grep;如果@missing,则打印“missing参数:@missing”
my %stuff = map { $_ => 1 } qw/ foo bar baz qrr qux asdf hello world /;
$stuff{foo} = 1; # toggle here

my $missing = grep { ! $stuff{$_} } qw/ foo bar baz qrr qux asdf hello world /;
print "missing argument" if $missing;