【发布时间】:2020-01-16 10:45:20
【问题描述】:
我有一个数组如下。需要以相反的顺序打印中间元素(元素索引 5 到元素索引 0)。
my @array = ( 1 .. 10 );
我需要的输出:
5
4
3
2
1
我尝试了下面的代码。但它不打印任何东西。
#!/usr/bin/perl
my @array = (1 .. 10);
for $k (5 .. 0){
print "$array[$k]\n";
}
【问题讨论】:
我有一个数组如下。需要以相反的顺序打印中间元素(元素索引 5 到元素索引 0)。
my @array = ( 1 .. 10 );
我需要的输出:
5
4
3
2
1
我尝试了下面的代码。但它不打印任何东西。
#!/usr/bin/perl
my @array = (1 .. 10);
for $k (5 .. 0){
print "$array[$k]\n";
}
【问题讨论】:
您的代码的问题是表达式 (5 .. 0) 没有返回任何内容,因为它意味着起始数字大于结尾。
您可以运行以下代码 sn-p 来查看问题(没有打印出来):
print for (5 .. 0);
为此,您需要使用list operator reverse:
print for (reverse 0 .. 5);
要考虑的另一件事:在 Perl 中,数组的第一个元素的索引为 0。因此,您要查找的列表是 (0 ..4) 而不是 (0 .. 5)。
这是您的更新代码:
my @array = (1 .. 10);
for my $k (reverse 0 .. 4) {
print "$array[$k]\n";
}
旁注:always use strict and use warnings。在这些 pragma 下,您的代码将失败变量 $k 未在代码中声明:它应该是 for my $k ... 而不是 for $k ...。
这也可以用更短的形式表示:
my @array = (1 .. 10);
print "$array[$_]\n" for (reverse 0 .. 4);
旁注#2:可以修改代码,使其根据数组的长度动态计算应打印哪些项目。为此,您可以使用表达式$#array,它返回数组中最高索引的值。
考虑:
print "$array[$_]\n" for (reverse 0 .. $#array/2);
如果您的数组是(1 .. 11)(即元素的数量不均匀),则会打印:
6
5
4
3
2
1
【讨论】: