0

嗨,我有一个数组作为 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";
}
4

5 回答 5

4

您应该使用该Data::Dumper模块,这样可以帮助您了解如何解析数据结构:

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

但是使用@ sigil (array) 来存储ARRAY ref很奇怪,$大多数时候使用 sigil (scalar) 来达到这个目的。(引用就像一个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
于 2013-03-18T20:48:14.537 回答
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";
}
于 2013-03-18T20:52:06.480 回答
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");
}
于 2013-03-18T20:52:18.703 回答
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";
}
于 2013-03-18T21:07:26.500 回答
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]]返回对列表列表的引用,而不是列表。

将 into 更改@$, 以$myarray生成变量。

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

要打印所有三个列表:

$myarray = [[1,2,3],[4,5,6],[7,8,9]];
map{printf "My string %s\n", join(" ",@{$_})} @{$myarray};
于 2013-03-18T21:04:52.400 回答