(m/regexp/) 或 {多个;命令;后;或者; }

问题描述 投票:0回答:3

我非常喜欢这个语法:

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;
    注意:括号对于
    warn
    是必需的,这样
    next
    就不会解析为其参数之一。
regex perl error-handling
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";
}

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 是由一位语言学家创建的。自然语言允许我们根据我们想要强调的部分以不同的方式表达相同的想法。就您而言,您想强调警告还是模式匹配?将更重要的代码放在前面。


0
投票

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

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

如果 try_something() 成功,那么它在 or 之后不会执行任何操作。

如果 try_something() 失败,则会发出警告并打印下一步。

© www.soinside.com 2019 - 2024. All rights reserved.