如何在perl中访问数组数组?

时间:2013-03-18 20:46:08

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

嗨我有一个数组作为myarray。我想将列表作为'1 2 3'加入第一个子阵列。我的字符串是打印我想的内存位置而不是列表。任何帮助将不胜感激。

@myarray = [[1,2,3],[4,5,6],[7,8,9]];
for (my $i=0; $i < @myarray; $i++) {
my @firstarray = $myarray[$i];
my $mystring = join("", @firstarray);
print "My string ".$mystring . ". "\n";
}

5 个答案:

答案 0 :(得分:4)

您应该使用Data::Dumper模块,这将有助于您了解如何解析数据结构:

print Dumper \@myarray; # force passing array as ref
$VAR1 = [
          [
            [
              1,
              2,
              3
            ],
            [
              4,
              5,
              6
            ],
            [
              7,
              8,
              9
            ]
          ]
        ];

但是使用@ sigil(数组)存储 ARRAY ref 很奇怪,大多数时候都使用$ sigil(标量)为了这个目的。 (引用就像一个C指针:一个存储单元的地址。所以它是一个简单的字符串,不需要其他东西而不是标量来存储它。

然后,您需要使用->运算符取消引用

前:

$ perlconsole
Perl Console 0.4

Perl> my $arrayref = [[1,2,3],[4,5,6],[7,8,9]];

Perl> print join "\n", @{ $arrayref->[2] }
7
8
9

答案 1 :(得分:4)

您必须通过@{ ... }取消引用内部数组引用。另外,不要将[...]用于顶部结构 - 使用普通括号(方括号创建数组引用,而不是数组)。您的print行上的连接也存在问题:

@myarray = ( [1,2,3], [4,5,6], [7,8,9] );
for (my $i=0; $i < @myarray; $i++) {
    my @firstarray = @{ $myarray[$i] };
    my $mystring = join("", @firstarray);
    print "My string " . $mystring . ".\n";
}

答案 2 :(得分:2)

你实际上有一个数组数组。

  • 外部数组有一个元素,即对数组的引用。
    $myarray[0]
  • 引用的数组有三个元素,每个元素都是对数组的引用。
    $myarray[0][0..2]
  • 每个引用的数组都有三个元素,三个数字。
    $myarray[0][0..2][0..2]

你想要

my @aoa = ([1,2,3],[4,5,6],[7,8,9]);
   ^       ^       ^       ^
   |        \------+------/
   |            3 inner
1 outer

$aoa[$i][$j]

for my $inner (@aoa) {
   print(join(', ', @$inner), "\n");
}

my $aoa = [[1,2,3],[4,5,6],[7,8,9]];
          ^^       ^       ^
          | \------+------/
          |      3 inner
       1 outer

$aoa->[$i][$j]

for my $inner (@$aoa) {
   print(join(', ', @$inner), "\n");
}

答案 3 :(得分:1)

您需要更改初始化数组的方式,以便()用于外部数组边界,[]用于内部数组,这意味着它们被声明为以后需要的引用被转换为其原生数组格式以进行处理(my @subarray = @{$myarray[$i]};

my @myarray = ([1,2,3], [4,5,6], [7,8,9]);

for (my $i=0; $i < @myarray; $i++) 
{
    my @subarray = @{$myarray[$i]};
    my $subarrayStr = join("", @subarray);
    print $i.". Subarray Str = ".$subarrayStr."\n";
}

答案 4 :(得分:0)

$myarray = [[1,2,3],[4,5,6],[7,8,9]];
printf "My string %s\n", join(" ", @{$myarray->[0]});

[[1,2,3],[4,5,6],[7,8,9]]返回对列表列表的引用,而不是列表。

@更改为$,使$myarray成为变量。

@{$myarray->[0]}将取消引用第一个子列表并返回您可以使用的列表。

打印所有三个列表:

$myarray = [[1,2,3],[4,5,6],[7,8,9]];
map{printf "My string %s\n", join(" ",@{$_})} @{$myarray};