Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有一种更干净的方式来有条件地';最后';退出这个Perl循环?_Perl_Syntactic Sugar - Fatal编程技术网

是否有一种更干净的方式来有条件地';最后';退出这个Perl循环?

是否有一种更干净的方式来有条件地';最后';退出这个Perl循环?,perl,syntactic-sugar,Perl,Syntactic Sugar,我并不真正了解Perl,我一直在友好搜索引擎的帮助下增强Perl脚本 我发现如果条件变为现实,我需要在设置标志时中断循环: foreach my $element (@array) { if($costlyCondition) { $flag = 1; last; } } 我知道使用“last”的更好方法是这样的: foreach my $element (@array) { last if ($costlyCondition); }

我并不真正了解Perl,我一直在友好搜索引擎的帮助下增强Perl脚本

我发现如果条件变为现实,我需要在设置标志时中断循环:

foreach my $element (@array) {
    if($costlyCondition) {
        $flag = 1;
        last;
    }
}
我知道使用“last”的更好方法是这样的:

foreach my $element (@array) {
    last if ($costlyCondition);
}
当然,这意味着虽然我可以享受语法的甜头,但我不能在循环内设置我的标志,这意味着我需要在循环外再次计算
$costlyCondition


有更干净的方法吗?

您可以使用
do{…}
块:

do {$flag = 1; last} if $costlyCondition

您可以使用
运算符加入语句:

$flag = 1, last if $costlyCondition;

您可以对逻辑
&
运算符执行相同的操作:

(($flag = 1) && last) if $costlyCondition;
甚至更低的优先级

(($flag = 1) and last) if $costlyCondition;


说到底,没有真正的理由去做这些。它们都与您的原始代码完全相同。如果您的原始代码正常工作且清晰易读,请保持原样。

一个想法是在子例程中执行循环,该子例程根据退出点返回不同的值

my $flag = check_elements(\@array);

# later...

sub check_elements {
  my $arrayref = shift;
  for my $ele (@$arrayref) {
    return 1 if $costly_condition;
  }
  return 0;
}

我同意Nathan的观点,虽然看起来整洁的代码是整洁的,但有时可读的版本更好。尽管如此,这里有一个可怕的版本:

last if $flag = $costly_condition;
注意使用赋值
=
代替相等
=
。赋值将返回
$costude\u条件下的任何值

这当然不会使
$flag=1
,但无论
$costude\u条件是什么。但是,既然这必须是真的,
$flag
。要解决这一问题,您可以——正如Zaid在评论中提到的那样——使用:

last if $flag = !! $costly_condition;

如前所述,这些解决方案非常糟糕,但确实有效。

这是可能的,但强烈不推荐使用:这些技巧会降低代码的可读性

foreach my $element (@array) {
    $flag = 1 and last if $costlyCondition;
}

last if$flag=$条件昂贵会起作用;)@zaid Hehe,是的,我也看到了。更糟的是:
除非$flag=$昂贵的条件
;)@但是,pavel会将
$flag
设置为false=P@TLP:你说得对;所以程序逻辑必须颠倒成。。。让它更糟糕…添加
$flag=1,如果$costlyCondition,则最后添加到工具架。在第二个示例中,删除{}。它们是不需要的。我学到的不是新的perl构造!(做)。谢谢就像你和几乎所有人所说的,最好保持代码的原样。后缀
如果真的只有一条语句。第一种方法更适合于一个条件上的多个语句。我认为在这种情况下,if块是更好的选择。循环控件上后缀条件的通常论点是,它将更重要的代码放在左边。强调循环有多个退出条件,这些退出条件是什么。在这种情况下,如果您使用一些建议的复合表达式,结果只是将循环控件埋在表达式中更深的位置,使其更难一目了然。@Joel:您是对的。我坚持原版。