1

我非常喜欢这种语法:

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不会被解析为它的参数之一。
4

3 回答 3

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";
}
于 2012-05-29T12:30:12.957 回答
5

对于您问题中的情况,我会使用unless.

for (@array) {
  unless (/regex/) {
    warn "Does not match";
    next;
  }

  ...
}

有时您可以不使用逗号运算符。它评估其左侧参数,丢弃结果,评估右侧参数并返回该结果。应用于您的情况,它看起来像

for (@array) {
  /regex/ or warn("Does not match"), next;

  ...
}

注意额外的括号。您必须更加小心括号和以这种方式分组。谨慎使用这种技术:它会很快变得丑陋。

在下面的评论中,Zaid 建议

warn('Does not match'), next unless /regex/;

选择是风格问题。Perl 是由一位语言学家创建的。自然语言允许我们根据我们想要强调的部分以不同的方式表达相同的想法。在您的情况下,您要强调警告还是模式匹配?将更重要的代码放在前面。

于 2012-05-29T12:40:04.283 回答
0

我发现(并测试)您也可以使用“和”:

try_something() or warn "Cant do it" and print "Hmm." and next;

如果 try_something() 成功,那么它在 or 之后什么也不做。

如果 try_something() 失败,那么它会发出警告并打印然后下一步。

于 2015-03-26T13:55:39.627 回答