代码之家  ›  专栏  ›  技术社区  ›  Aakash Goel

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

  •  25
  • Aakash Goel  · 技术社区  · 14 年前

    当我使用这个代码时,我得到了这个错误

    sub search {
        my ($a, @a_list) = @_;
        foreach (@a_list) {
            if($_ == $a) return TRUE;
            # continue;
        }
        return FALSE;
    }
    

    语法错误代码.pl第26行,靠近“返回”

    • return TRUE ?
    • 还有,正确的方法是什么 continue ?

    我知道我应该更多地考虑Perl术语,而不是试图用这种方式将C代码转换成Perl。

    3 回复  |  直到 14 年前
        1
  •  58
  •   Community Lee    7 年前

    回报、继续、中断的等价物

    • return
    • next
    • last 相当于休息。

    “if”语句后跟块

    你的问题是 if 语句后面总是有一个大括号内的块。

    if ($_ == $a) { return TRUE; }
    elsif (...)   { ... }
    else          { ... }
    

    尽管有时有点冗长,我同意你的看法 ysth 这是Perl做对的。有关有趣的备选方案,请参阅 Go 编程语言,它将括号视为不必要的,并强制使用大括号。

    “if”可用作限定符

    如果 作为语句修饰符:

    return TRUE if $_ == $a;
    

    你也可以使用 unless 而不是 要反转条件:

    return TRUE unless $_ != $a;
    

    Phillip Potter 指出,混合 除非 使用否定条件会使理解更加困难;示例与问题直接做相同的事情,但最好写成否定条件 如果 平等地。)

    使用“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; '和' use warnings;

    真与假

    另外,正如其他答案中首先指出的,Perl没有预定义的常数true和false,任何比C或C++都要多(C++有内置的)。 true false 是的 有条件的,如果你 #include <stdbool.h>

    use constant TRUE => 1;
    use constant FALSE => 0;
    

    不过,要小心。有些事情即使不等于真,也会是真的;有些事情即使不等于假,也会是假的。


    注释中包含关于不使用的讨论 $a $b 作为变量。相关评论依次为:

    • 请避免使用$a,除非它位于排序块中。 Zaid

    • phaylon

    • @phaylon:严格来说,它们是“包全局变量”(参见Perl) sort ). 是的,在排序时,它们与lexicals(my)变量不同。当您不进行排序时,如果您显式地声明它们,那么它们可以被视为词汇表。乔纳森·莱弗勒

    • @jonathanleffler,它们也不必使用严格的qw(vars);因此您可能不会注意到您正在从另一个范围践踏它们。 Ven'Tatsu

    指出显而易见的:我只使用 因为问题确实存在,我没有用大量的细节淹没原始的海报,而是把重点放在了主要的方面。例如,讨论 下一个 没有提到循环标签。

    也就是说,建议“避免使用 一美元 十亿美元

        2
  •  7
  •   mscha    14 年前

    你的问题(非常!)Jonathan全面地回答了这个问题,但我想指出一些其他更为实用的方法来取代“搜索”功能。

    use strict;
    use warnings;
    use 5.010;
    
    my @a_list = (1, 2, 3);
    my $a = 2;
    
    # If you're using 5.10 or higher, you can use smart matching.
    # Note that this is only equivalent if $a is a number.
    # That is, "2.0" ~~ ["1", "2", "3"] is false.
    say $a ~~ @a_list;
    
    # Need to install List::MoreUtils, not a standard module
    use List::MoreUtils qw(any);
    say any { $a == $_ } @a_list;
    
    # List::Util is a core module
    use List::Util qw(first);
    say defined first { $a == $_ } @a_list;
    
    # No modules used, but less efficient
    say grep { $a == $_ } @a_list > 0;
    

    有关更多信息,请参阅的文档 smart matching , List::MoreUtils , List::Util grep

        3
  •  4
  •   Eric Strom    14 年前

    Perl没有内置的true和false常量。true的规范值为 1 () (在列表上下文中为空列表,在标量上下文中为未定义)。

    sub search {
        my $key = shift;
        foreach (@_) {
            return 1 if $_ == $key;
        }
        return ();
    }