代码之家  ›  专栏  ›  技术社区  ›  planetp

Perl中的“for”和“foreach”有什么区别?

  •  29
  • planetp  · 技术社区  · 14 年前

    我看这些可以互换使用。有什么区别?

    8 回复  |  直到 10 年前
        1
  •  36
  •   Sinan Ünür    14 年前

    没有区别。从 perldoc perlsyn :

    这个 foreach 关键字实际上是 for 关键字,以便您可以使用 前额 为了可读性或 对于 为简洁起见。

        2
  •  13
  •   Sinan Ünür    14 年前

    我看这些可以互换使用。

    除了语法上的区别,没有别的区别。

        3
  •  5
  •   Dave Sherohman    14 年前

    四个字母。

    他们是 功能上 一模一样,只是拼写不同。

        4
  •  3
  •   Greg Bacon    14 年前

    从那以后 introduction in perl-2.0 , foreach 一直是 for . 这是对c外壳的点头 foreach 命令。

    在我自己的代码中,在很少使用c风格for循环的情况下,我编写

    for (my $i = 0; $i < $n; ++$i)
    

    但是对于在数组上迭代,我指出

    foreach my $x (@a)
    

    我发现这样在我的脑海里读起来更好。

        5
  •  0
  •   knex    13 年前

    foreach关键字实际上是for关键字的同义词,因此可以使用foreach来提高可读性或简洁性。(或者因为bourne shell比csh更熟悉,所以更自然地编写for。)如果省略var,则将$设置为每个值。

        6
  •  0
  •   dimas    10 年前

    http://perldoc.perl.org/perlsyn.html#Foreach-Loops

    foreach关键字实际上是for关键字的同义词,因此 两者都可以。如果忽略var,则将为每个值设置$。

    # Perl's C-style
    for (;;) {
        # do something
    }
    
    for my $j (@array) {
        print $j;
    }
    
    foreach my $j (@array) {
        print $j;
    }
    

    然而:

    如果列表的任何部分是数组,那么foreach将非常困惑 在回路主体中添加或删除元素,例如使用接头。 所以不要那样做。

        7
  •  -2
  •   Guillaume Vauvert    12 年前

    有一个微妙的区别( http://perldoc.perl.org/perlsyn.html#Foreach-Loops ):

    foreach循环迭代正常的列表值,并依次将变量var设置为列表的每个元素。如果变量前面有关键字my,那么它在词汇范围内,因此仅在循环中可见。否则,该变量将隐式地位于循环的本地,并在退出循环时重新获取其以前的值。如果该变量以前是用my声明的,那么它将使用该变量而不是全局变量,但它仍然局限于循环。这种隐式本地化只发生在foreach循环中。

    此程序:

    #!/usr/bin/perl -w
    
    use strict;
    
    my $var = 1;
    for ($var=10;$var<=10;$var++) {
      print $var."\n"; # print 10
      foo(); # print 10
    }
    
    print $var."\n"; # print 11    
    
    foreach $var(100) {
      print $var."\n"; # print 100
      foo(); # print 11 !
    }
    
    sub foo {
      print $var."\n";
    }
    

    将产生:

    10
    10
    11
    100
    11
    
        8
  •  -3
  •   muruga    14 年前

    如果是“for”,您可以使用这三个步骤。

    1)初始化 2)条件检查 3)增减

    但在“foreach”的情况下,您不能增加或减少该值。它总是取增量值为1。