return、continue、break 的等价物
-
return 相当于 return。
-
next 相当于继续。
-
last 相当于 break。
'if' 语句后跟块
您的问题是if 语句后面总是跟一个大括号内的块。
if ($_ == $a) { return TRUE; }
elsif (...) { ... }
else { ... }
尽管有时看起来有点冗长,但我同意ysth 的观点,这是 Perl 做对的事情。有关有趣的替代方法,请参阅Go 编程语言,它将括号视为不必要的并强制使用大括号。
'if' 可以用作限定符
或者您可以使用if 作为语句修饰符:
return TRUE if $_ == $a;
请注意,在这种情况下,您不必在条件表达式周围使用括号,尽管添加它们并没有什么坏处。
使用“除非”
您也可以使用unless 代替if 来反转条件:
return TRUE unless $_ != $a;
(并且,正如Phillip Potter 指出的那样,将unless 与否定条件混合会使理解更加困难;该示例直接与问题相同,但最好写为具有相等性的if。)
使用“下一个”和“最后一个”
您可以类似地使用next 和last:
sub search {
my ($a, @a_list) = @_;
foreach (@a_list) {
return TRUE if $_ == $a;
last if $_ > $a;
next if $ptom != LAST_QUARTER;
...
}
return FALSE;
}
注意foreach 循环中的修正。(修改问题以包含修正。)确保您始终拥有“use strict;”和“@987654345” @' 在脚本的顶部。专家总是使用它们来确保他们没有犯错。初学者应该出于完全相同的原因使用它们。
对与错
此外,正如在其他答案中首先指出的那样,Perl 没有预定义的常量 TRUE 和 FALSE,与 C 或 C++ 一样(C++ 有内置的 true 和 false;C99 有 @ 987654348@ 和 false 有条件地可用,如果您 #include <stdbool.h>)。您可以为 Perl 提供以下定义:
use constant TRUE => 1;
use constant FALSE => 0;
不过要小心。即使不等于 TRUE,有些事情也会是“真实的”;即使不等于 FALSE,其他内容也会为“假”。
讨论'$a'和'$b'的使用
cmets 包含关于不使用$a 和$b 作为变量的讨论。依次,相关的 cmets 是:
请避免使用 $a,除非它位于排序块中。 – Zaid
@Zaid:很好的一点是 $a 和 $b 在排序块的上下文中是特殊的。我不确定是否有法令要求它们永远不应该被使用——当还有一个排序块潜伏在周围时使用它们会很糟糕,但是在没有排序块的情况下,我看不出有任何理由对待 $a 和不同于 $z。 ——乔纳森·莱弗勒
$a 和 $b 是全局变量,因此其行为与词法不同。 – phaylon
@phaylon:好吧,严格来说,它们是“全局包”(参见 Perl sort)。是的,当您进行排序时,它们与词汇(我的)变量不同。当您不进行排序时,如果您明确声明它们,它们可以被视为词汇。 ——乔纳森·莱弗勒
@Jonathan Leffler,它们也免于使用 strict qw(vars);所以你可能不会注意到你正在从另一个范围内践踏它们。 – Ven'Tatsu
指出显而易见的问题:我只使用了$a,因为问题确实如此——我没有用大量细节淹没原始海报,而是主要关注要点。比如last和next的讨论没有提到循环标签。
也就是说,“避免使用$a 和$b 作为变量”的建议是合理的;出于所指出的原因,它们是特殊名称,使用它们会留下可能会或可能无法检测到的错误的可能性。