Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这是';对于';和';foreach&x27;用Perl?_Perl_Loops_Syntax_For Loop_Foreach - Fatal编程技术网

什么';这是';对于';和';foreach&x27;用Perl?

什么';这是';对于';和';foreach&x27;用Perl?,perl,loops,syntax,for-loop,foreach,Perl,Loops,Syntax,For Loop,Foreach,我看到这些可以互换使用。有什么区别 我看到这些可以互换使用 除了语法上的区别之外,没有其他区别。没有区别。发件人: foreach关键字实际上是for关键字的同义词,因此您可以使用foreach以提高可读性,或者使用for以简化操作 四个字母 它们在功能上完全相同,只是拼写不同。自其出现以来,foreach一直是for的同义词。这是对C shell命令的点头 在我自己的代码中,在使用C风格for循环的罕见情况下,我编写 for (my $i = 0; $i < $n; ++$i) 我发现

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

我看到这些可以互换使用


除了语法上的区别之外,没有其他区别。

没有区别。发件人:

foreach
关键字实际上是
for
关键字的同义词,因此您可以使用
foreach
以提高可读性,或者使用
for
以简化操作

四个字母

它们在功能上完全相同,只是拼写不同。

自其出现以来,
foreach
一直是
for
的同义词。这是对C shell命令的点头

在我自己的代码中,在使用C风格for循环的罕见情况下,我编写

for (my $i = 0; $i < $n; ++$i)
我发现这样在我的脑海里读起来更好。

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

1) 初始化 2) 状态检查 3) 增加或减少

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

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


有一个微妙的区别():

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";
}

foreach关键字实际上是for关键字的同义词,因此 两种方法都可以。如果省略了VAR,则将$\设置为每个值

然而:

若列表的任何部分是数组,若您 在回路主体内添加或删除图元,例如使用接头。 所以不要那样做


+1是的,Perl在语法方面非常丰富。有不止一种说法,实际上是编译到相同的操作码。因此,无论出于何种目的,它们都是相同的。我发现恰恰相反:我总是对我的$x(@a)使用
。我更喜欢Python的
for a
循环中的x,或者甚至是PHP的
for(@a as$x)
。我从不在循环中使用C风格的
。我会把你拥有的东西写成我的$I(0..$n)
。Perl special case对其进行了优化,以避免创建不必要的列表,因此它与显式C-style
for
循环之间的差异应该可以忽略不计,而且我认为这样更具可读性。@Chris Lutz:所以你永远不需要做比1乘1更复杂的事情了?我可以想到几个不同的应用程序,其中C风格的循环是编写它的最佳方式。我现在能想到的最简单的例子是,只想用(我的$I=1;$I<@x;$I+=2){…}
之类的东西来冒险,它们过去是不同的想法,但现在是同义词。Perl根据()中的内容而不是使用关键字来确定要做什么。责怪那些不能多输入四个字符的人。:)这也被解释了,这实际上是一个错误的答案,因为这发生在
for
foreach
循环中。您可以自己尝试—如果您在代码中翻转
for
foreach
,没有发生任何错误,结果是一样的:foreach调用foo()打印全局$var的值(因此为1),因为对foo()的“for”调用打印的是本地$var的值(因此为10),而不是我得到的值。我在翻页前后得到10 10 11 100 11。在linux x86_64上使用perl 5.10.1。@pera答案和示例都是错误的。范围或其他方面的任何差异都是由括号内的内容设置的,而不是由关键字本身设置的。这不是真的。您可以对两个关键字(for和foreach)使用这两种语法约定,除了关键字本身没有任何区别。它将循环5次打印12345,我们没有使用您提到的步骤<代码>为(1..5)打印$uu
#!/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
# Perl's C-style
for (;;) {
    # do something
}

for my $j (@array) {
    print $j;
}

foreach my $j (@array) {
    print $j;
}