总是我理解
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
循环,而不更改任何其他内容,它将按预期工作。
这只是最近的一个例子,显然我在这里遗漏了一些东西,任何人都可以帮助我吗?
答案 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;...)
之类的错误引起的意外错误。
也就是说,for
和foreach
实际上是在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>