对于perl中的循环帮助

时间:2014-02-10 09:26:47

标签: perl

我正在编写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" );
    }
}

谢谢,对不起解释

5 个答案:

答案 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总是更好,这将消除任何错误的可能性。特别是在判断退出循环的适当条件时。