在Perl中打印“多维”数组

时间:2016-03-24 02:20:59

标签: arrays perl multidimensional-array dereference perl-data-structures

我在尝试打印包含数组的数组时遇到问题。打印包含其他数组的数组@dev时,我只能打印前三个,因为#printing内嵌注释表示。注释行#print($dev[4][2]);工作正常,以及允许范围内的任何其他数字组合。由于某种原因,for循环不起作用。救命啊!?

my @dev;
my @tf;
my @a;
my @t;
my @f;
my @ofv;
my @tfv;

@tf = ('123456787', '123456788', '123456789'); #printing
@a = (78, 65, 57); #printing
@t = (70, 55, 42); #printing
@f = (77, 64, 56);
@ofv = ('true', 'false', 'false');
@tfv = ('false', 'true', 'true');       

@dev = (
    [@tf],
    [@a],
    [@t],
    [@f],
    [@ofv],
    [@tfv],
);

#print($dev[4][2]);

for (my $i = 0; $i <= (scalar(@tf) - 1); $i++) {
    for (my $j = 0; $j <= (scalar(@dev) - 1); $j++) {
        print($dev[$i][$j]);
        print("\n");
    }
}

谢谢。

3 个答案:

答案 0 :(得分:3)

Perl可以非常紧凑。 这段代码为我的数组@ arr1,@ arr2和@ arr3做了同样的事情:

@arr1 = (1..10);
@arr2 = ('a'..'j');
@arr3 = ('.') x 10;

@multid = \(@arr1, @arr2, @arr3);
print "@$_\n" for (@multid);

输出:

1 2 3 4 5 6 7 8 9 10
a b c d e f g h i j
. . . . . . . . . .

同样[]复制一个数组并给它一个引用(它是内存中的一个匿名数组,不管数组是什么,都是他的副本)。如果不需要这样的重复,最好使用反斜杠\,而不是应对现有数组的引用。 (比如C中的&运算符,告诉我们perldoc)

答案 1 :(得分:3)

如果您只想显示此类复杂数据结构的数据,则模块Data::DumperSmart::Comments可能是不错的选择。

use Data::Dumper;
print Dumper(\@dev);

use Smart::Comments;
### @dev

输出更加perl风格并且不那么可读,但是显示这种复杂数据的结构非常方便。

答案 2 :(得分:1)

你的最外面的for循环受到t的长度约束,它是3.它永远不会打印超过三个数组。

如果我理解你要做什么,你需要顶级交换@t和@dev。这将打印您的所有价值。

然而,这不会打印任何长于3的数组(dev的长度)。

为此,您需要:

@dev = (
    [@tf], # Probably meant tf
    [@a],
    [@t],
    [@f],
    [@ofv],
    [@tfv],
);

#print($dev[4][2]);

for (my $i = 0; $i < @dev; $i++) {
    for (my $j = 0; $j < @{ $dev[$i] }; $j++) {
        print($dev[$i][$j]);
        print("\n");
    }
}