是否有一种更干净的方式来有条件地';最后';退出这个Perl循环?
我并不真正了解Perl,我一直在友好搜索引擎的帮助下增强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); }
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:您是对的。我坚持原版。