我可以使用数组的大小而不必将其放置在变量中吗

时间:2019-01-23 20:04:58

标签: perl

目前,我正在这样做以读取数组的各个内容

my $size = @words;
for(my $x = 0; $x < $size, $x++)
{
   print $words[$x]; 
}

是否可以跳过$ size分配?一种转换数组并减少一行的方法吗?

for(my $x = 0; $x < $(@word), $x++)
{
   print $words[$x]; 
}

似乎找不到正确的语法。

谢谢

4 个答案:

答案 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 iteratorforforeach是同义词。

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