我正在编写perl脚本,我对循环限制几乎没有疑问。
假设我有两个数组,arr1有序列号,arr2是二维数组,第一个维度是序列号[与arr1相同],第二个维度是该序列号的内容,现在我想申请这个二维数组的for循环,但我很困惑的极限。直到现在我有了这段代码
Example : I have Three serial numbers , 1 ,2 ,3 . Serial 1 has 2 contents 1,5 . Serial 2 has 1 content i.e 1. Serial 3 has two contents 1,1.
@arr1 = (1,2,3)
$arr2[0][0] = 1
$arr2[0][1] = 5
$arr2[1][0] = 1
$arr2[2][1] = 1
$arr2[2][2] = 1
Note: As you can see the contents of arr2 has arr1 elements in 1st columns and the contents in the second columns.
for (my $i = 0; $i <= $#arr1; $i++) {
print( "The First Serial number has:" );
for (my $j = 0; $j <= $#arr2; $j++) {
print( "$arr2[$i][$j]\n" );
}
}
谢谢,对不起解释
答案 0 :(得分:1)
为什么不这样做:
#!/usr/bin/perl
use strict;
my @arr;
$arr[0][0] = 1;
$arr[0][1] = 5;
$arr[1][0] = 1;
$arr[2][1] = 1;
$arr[2][2] = 1;
my ($i, $j);
foreach $i (@arr) {
foreach $j (@{$i}) {
print $j."\n" if($j);
}
}
1;
__END__
答案 1 :(得分:1)
固定代码:
use strict;
use warnings;
my @arr1 = (1,2,3);
my @arr2;
$arr2[0][0] = 1;
$arr2[0][1] = 5;
$arr2[1][0] = 1;
$arr2[2][0] = 1; # original code had
$arr2[2][1] = 1; # these indexes wrong
for (my $i = 0; $i <= $#arr1; $i++) {
print( "Serial number $arr1[$i] has:" );
for (my $j = 0; $j <= $#{ $arr2[$i] }; $j++) {
print( "$arr2[$i][$j]\n" );
}
}
注意使用$#{ arrayref }
;见http://perlmonks.org/?node=References+quick+reference
答案 2 :(得分:1)
你可以像@arr2
这样放置@arr2
use strict;
use warnings;
my @arr1 = (1, 2, 3);
my @arr2 = ([1, 5], [1], [1, 1]);
for my $first(@arr1) {
for my $second (@{$arr2[$first-1]}) {
print $second."\n";
}
}
答案 3 :(得分:0)
这是没有第一个数组的版本。
for (my $i = 0; $i<= $#arr; $i++)
{
print "INDEX $i\n";
for (my $j = 0; $j <= $#{$arr[$i]}; $j++)
{
print "${arr[$i][$j]}\n";
}
}
这里的要点是二维数组实际上是一个数组数组(实际上是数组引用,但这里不会改变任何东西)。因此,在内部循环中,您应该检查$arr[$i]
中存储的数组的大小。
答案 4 :(得分:0)
试试这个。
my @arr2;
$arr2[0][0] = 1;
$arr2[0][1] = 5;
$arr2[1][0] = 1;
$arr2[2][0] = 1;
$arr2[2][1] = 1;
foreach $inside_array (@arr2){
foreach $ele (@$inside_array){
print $ele,"\n";
}
}
使用foreach而不是for / while总是更好,这将消除任何错误的可能性。特别是在判断退出循环的适当条件时。