我非常喜欢这种语法:
try_something() or warn "Cant do it";
如何在or
之后添加更多命令?
例如,它在这段代码中很有用:
foreach (@array)
{
m/regex/ or {warn "Does not match"; next;} # this syntax is wrong
...
}
我找到的一种方法是
try_something() or eval {warn "Can't do it"; next;};
但我认为这是个坏主意。
最佳答案:
do
优于eval
。do_smth() or warn("Does not match"), next;
Nota bene:warn
必须使用括号,以便next
不会将其解析为其中一个参数。答案 0 :(得分:6)
我认为这会很快变得难以理解,但你可以do
:
foo() or do { bar(); baz(); };
sub foo {
return $_[0] == 2;
}
for (1..3) {
print $_;
foo($_) or do { print " !foo\n"; next; };
print " foo!\n";
}
答案 1 :(得分:5)
对于您问题中的案例,我会使用unless
。
for (@array) {
unless (/regex/) {
warn "Does not match";
next;
}
...
}
您有时可以使用comma operator。它评估它的左手参数,抛弃结果,评估右手参数并返回结果。适用于您的情况看起来像
for (@array) {
/regex/ or warn("Does not match"), next;
...
}
请注意额外的括号。你必须更加小心括号并以这种方式分组。在使用这种技术时要明智:它很快就会变丑。
在下面的评论中,Zaid建议
warn('Does not match'), next unless /regex/;
选择是一种风格问题。 Perl是由语言学家创建的。自然语言允许我们以不同的方式表达相同的思想,这取决于我们想要强调的部分。在您的情况下,您想强调警告或模式匹配吗?将更重要的代码放在前面。
答案 2 :(得分:0)
我想出(并测试过)你也可以使用'和':
try_something() or warn "Cant do it" and print "Hmm." and next;
如果try_something()成功,那么在或之后它就不会做任何事情。
如果try_something()失败,则会发出警告并打印下一个。