sub search { my ($a,@a_list) = @_; foreach (@a_list) { if($_ == $a) return TRUE; # continue; } return FALSE; }
Syntax error at code.pl line 26,near “) return”
>什么是正确的方式返回TRUE?
>还有,正确的方法是继续吗?
我知道我应该在Perl中更多地思考,而不是以这种方式将C代码转换为Perl。
解决方法
return是相当于return的。
>接下来是等同于继续。
>最后是相当于休息。
‘if’语句后跟块
你的问题是,一个if语句总是跟着大括号内的一个块。
if ($_ == $a) { return TRUE; } elsif (...) { ... } else { ... }
对于所有这些,有时候似乎有点冗长,我同意ysth这是Perl的对象。对于一个有趣的替代方案,请参阅Go编程语言,它将括号视为不必要的,并且要求大括号。
‘if’可以用作限定词
或者您可以使用if作为语句修饰符:
return TRUE if $_ == $a;
请注意,在这种情况下,您不必在条件表达式周围使用括号,尽管添加它们并不会有任何损害。
使用’除非’
您也可以使用,除非如果反转条件:
return TRUE unless $_ != $a;
(而且,正如Phillip Potter所指出的那样,混合除非有一个否定条件使得理解更加困难;这个例子直接与问题一样,而是更好地写成如果平等的话)。
使用“下一个”和“最后”
你可以使用下一个和最后一个类似:
sub search { my ($a,@a_list) = @_; foreach (@a_list) { return TRUE if $_ == $a; last if $_ > $a; next if $ptom != LAST_QUARTER; ... } return FALSE; }
请注意foreach循环中的修正。 (问题修改为包括修复。)确保您始终使用“严格”和“使用警告”在你的脚本的顶部。专家总是用它们来确保他们没有犯错。初学者应该使用它们完全相同的原因。
真假
另外,正如其他答案中首先指出的那样,Perl没有预定义的常量TRUE和FALSE,除C或C以外(C有一个内置的true和false; C99具有true和false有条件地可用,如果#包括< stdbool.h>)。您可以为Perl提供以下定义:
use constant TRUE => 1; use constant FALSE => 0;
不要小心了。即使不等于TRUE,一些事情也将是“真实的”;即使不等于FALSE,其他事情也将是“假的”。
讨论使用’$ a’和’$ b’
这些评论包含一个关于不使用$ a和$ b作为变量的讨论。依次,有关意见是:
>请避免使用$ a,除非它在排序块中。 – Zaid
> @Zaid:好点,$ a和$ b在排序块的上下文中是特殊的。我不知道是否有法令,他们不应该用其他方式 – 当有一个潜在的排序块时,使用它们将是恶毒的,但是在没有排序框的情况下,我没有看到任何理由对待$ a并且不同于$ z。 – 乔纳森·莱夫勒
> $ a和$ b是全局变量,因此表现与词汇不同。 – phaylon
> @phaylon:好吧,严格来说它们是“全局包”(见Perl sort)。是的,当你排序时,它们与词汇(我)的变量不同。当你没有进行排序时,如果你明确地声明它们,那么它们可以被视为词汇。 – 乔纳森·莱夫勒
> @Jonathan Leffler,他们也免除了使用严格的qw(vars);所以你可能不会注意到你从另一个范围践踏他们。 – Ven’Tatsu
指出明显的:我只使用$ a,因为问题是 – 而不是淹没原来的海报有很多细节,我主要保持的要点。例如,上一个和下一个的讨论没有提到循环标签。
也就是说,建议“避免使用$ a和$ b作为变量”是声音;它们是指定的原因的特殊名称,并且使用它们留下可能或可能不被检测到的错误的可能性。