关于foreach循环,我没有得到什么?

时间:2014-04-19 20:17:06

标签: perl loops for-loop foreach

总是我理解

foreach (@arr)
{
    ....
}

for(my $i=0; $i<@arr; $i++)
{
    .....
}

功能相同。 但是,在我的所有代码中,每当我使用foreach循环时,我遇到的问题在我更改为for循环时会得到修复。它总是与比较两件事的值,通常是嵌套循环。

以下是一个例子:

for(my $i=0; $i<@files; $i++)
{
    my $sel;
    foreach (@selected)
    {
        if(files[$i] eq selected[$_])
        {
            $selected='selected';
        }
    }
    <option value=$Files[$i] $sel>$files[$i]</option>
}

以上代码介于cgi程序中的select标签之间。 基本上我是根据用户规格编辑选择框的内容。 但在添加或删除选项后,我希望原始选择的选项保持选中状态。

上面的代码应该在重新组装下一个表单上的选择时完成此操作。但是,使用foreach版本时,它只会获得所选的第一个选项并跳过其余部分。如果我将它切换到3部分for循环,而不更改任何其他内容,它将按预期工作。

这只是最近的一个例子,显然我在这里遗漏了一些东西,任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:4)

我们假设@files是文件名列表。

在以下代码中,$i是数组 index (即它是一个整数):

for (my $i=0; $i<@files; $i++) { ... }

在以下代码中,$i依次设置为每个数组 item (即它是文件名):

foreach my $i (@files) { ... }

例如:

use strict;
use warnings;

my @files = (
   'foo.txt',
   'bar.txt',
   'baz.txt',
);

print "for...\n";
for (my $i=0; $i<@files; $i++) {
   print "\$i is $i.\n";
}

print "foreach...\n";
foreach my $i (@files) {
   print "\$i is $i.\n";
}

产生以下输出:

for...
$i is 0.
$i is 1.
$i is 2.
foreach...
$i is foo.txt.
$i is bar.txt.
$i is baz.txt.

foreach循环通常首选用于循环遍历数组,以避免由for (my $i=1;...;...)for (my $i=0;$i<=@arr;...)之类的错误引起的意外错误。

也就是说,forforeach实际上是在Perl中实现为同义词,因此以下脚本生成与前一个示例相同的输出:

use strict;
use warnings;

my @files = (
   'foo.txt',
   'bar.txt',
   'baz.txt',
);

print "for...\n";
foreach (my $i=0; $i<@files; $i++) {
   print "\$i is $i.\n";
}

print "foreach...\n";
for my $i (@files) {
   print "\$i is $i.\n";
}

习惯上将第二种类型的循环称为foreach循环,即使源代码使用关键字for来执行循环(已经变得非常普遍)。 / p>

相关问题