目前,我正在这样做以读取数组的各个内容
my $size = @words;
for(my $x = 0; $x < $size, $x++)
{
print $words[$x];
}
是否可以跳过$ size分配?一种转换数组并减少一行的方法吗?
即
for(my $x = 0; $x < $(@word), $x++)
{
print $words[$x];
}
似乎找不到正确的语法。
谢谢
答案 0 :(得分:4)
替换
for (my $i = 0; $i < $(@words), $i++) { ... $words[$i] ... }
使用
for (my $i = 0; $i < @words; $i++) { ... $words[$i] ... }
就像您的作业一样,在标量上下文中求值的数组会产生其大小。
也就是说,使用C样式的循环既复杂又浪费。
需要索引的更好解决方案:
for my $i (0..$#words) { ... $words[$i] ... }
不需要索引的更好解决方案:
for my $word (@words) { ... $word ... }
答案 1 :(得分:3)
是的,for
has a built in array iterator和for
和foreach
是同义词。
for my $word (@words) {
print $word;
}
这是在Perl中遍历数组的首选方法。除非必要,否则不建议使用C型3语句for循环。它们更难阅读,并导致像这样的错误。
for(my $x = 0; $x < $size, $x++)
^
should be a ;
答案 2 :(得分:3)
最好使用foreach
,但是对于您的特定问题,@foo
在标量上下文中解析为数组的长度,而$#foo
解析为最后一个元素的索引:< / p>
foreach my $word (@words) { ... } # preferred
for(my $i = 0; $i < @words; ++$i) { my $word = $words[$i]; ... } # ok sometimes
for(my $i = 0; $i <= $#words; ++$i) { my $word = $words[$i]; ... } # same thing
(假设您没有玩过$[
,您不应该这样做。)
答案 3 :(得分:1)
您要搜索的语法实际上根本没有语法。如果在Perl知道应该使用标量值的任何地方使用数组变量(例如,作为比较运算符的操作数),则Perl会为您提供数组中元素的数量。
因此,根据您的示例,这将起作用:
# Note: I've corrected a syntax error here.
# I replaced a comma with a semicolon
for (my $x = 0; $x < @words; $x++)
{
print $words[$x];
}
但是有几种方法可以改善这一点。首先,让我们摆脱丑陋且可能引起混乱的C样式for
循环,并用更容易理解的foreach
代替它。
foreach my $x (0 .. @words - 1)
{
print $words[$x];
}
我们还可以对此@words - 1
进行改进。相反,我们可以使用$#words
来给出数组@words
中的最终索引。
foreach my $x (0 .. $#words)
{
print $words[$x];
}
最后,我们实际上并不需要索引号,因为我们只是使用它依次访问数组的每个元素。遍历数组的元素而不是索引要好得多。
foreach my $element (@words)
{
print $element;
}