perl - C 中 return 和 continue 关键字的 Perl 等价物是什么?

标签 perl

使用此代码时出现此错误

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"


  • return TRUE的正确方法是什么? ?
  • 另外,continue的正确方法是什么? ?

  • 我知道我应该更多地考虑 Perl 术语而不是尝试以这种方式将 C 代码转换为 Perl。

    最佳答案

    return、continue、break 的等价物

  • 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 并具有相等性。)

    使用“下一个”和“上一个”

    您可以使用 nextlast相似地:
    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;” ' 和 ' use warnings; ' 在脚本的顶部。专家总是使用它们来确保他们没有犯错误。初学者应该出于完全相同的原因使用它们。

    真假

    此外,正如其他答案中首先指出的那样,Perl 没有预定义的常量 TRUE 和 FALSE,与 C 或 C++ 一样(C++ 具有内置的 truefalse ;C99 具有 truefalse 如果您 #include <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)。是的,在排序时,它们与词法(my)变量不同。当您不进行排序时,如果您明确声明它们,则它们可以被视为词法。 – 乔纳森莱夫勒
  • @Jonathan Leffler,他们也免于使用严格的 qw(vars);所以你可能不会注意到你正在从另一个范围践踏它们。 – Ven'Tatsu

  • 指出明显的:我只使用了 $a因为这个问题确实存在 - 而不是用大量细节淹没原始海报,我主要保留了要点。比如last的讨论和 next没有提到循环标签。

    也就是说,建议“避免使用 $a$b 作为变量”是合理的;由于所指出的原因,它们是特殊名称,使用它们可能会出现错误,这些错误可能会或可能不会被检测到。

    关于perl - C 中 return 和 continue 关键字的 Perl 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3575979/

    相关文章:

    linux - 从 perl 运行时将 bash 脚本的输出记录到日志文件和标准输出中

    python - Python 中 Perl 的 BEGIN{} block

    perl - Perl 中单引号和双引号有什么区别?

    perl - 在 Perl 中将 UTF8 字符串转换为数值

    Perl 模块 "did not return a true value"

    bash - 提取每个 ID 的主要号码和次要号码并生成 JSON 字符串

    database - ip2location 查询超过一百万条记录

    perl - 如何使用 Perl 对 Gmail 进行身份验证?

    regex - 正则表达式中的负回顾

    ajax - 如何使用 WWW::Mechanize (ajax) 发布表单