(m / regexp /)或{倍;命令;后;要么; }

时间:2012-05-29 12:22:07

标签: perl error-handling

我非常喜欢这种语法:

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;}; 

但我认为这是个坏主意。

最佳答案:

  1. do优于eval
  2. 逗号运算符甚至更好:do_smth() or warn("Does not match"), next; Nota bene:warn必须使用括号,以便next不会将其解析为其中一个参数。

3 个答案:

答案 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()失败,则会发出警告并打印下一个。