Arrays 如何在perl中访问数组的数组?
嗨,我有一个数组作为myarray。我想把它列为“1 2 3”,它将加入第一个子阵列。我的字符串打印的是我假定的内存位置,而不是列表。任何帮助都将不胜感激Arrays 如何在perl中访问数组的数组?,arrays,perl,join,multidimensional-array,perl-data-structures,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 ".$mystr
@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";
}
@myarray=[[1,2,3]、[4,5,6]、[7,8,9];
对于(my$i=0;$i<@myarray;$i++){
my@firstarray=$myarray[$i];
我的$mystring=join(“,@firstarray”);
打印“我的字符串”。$mystring.“\n”;
}
您应该使用Data::Dumper
模块,这样可以帮助您了解如何解析数据结构:
print Dumper \@myarray; # force passing array as ref
$VAR1 = [
[
[
1,
2,
3
],
[
4,
5,
6
],
[
7,
8,
9
]
]
];
但是使用@
(数组)来存储数组引用是很奇怪的,大多数情况下都会使用$
符号(标量)(引用就像C
指针:指向内存单元的地址。因此它是一个简单的字符串,不需要标量以外的东西来存储它)
然后,需要使用->
操作符取消引用
例:
您必须通过
@{…}
取消对内部数组引用的引用。另外,不要对顶部结构使用[…]
-使用普通括号(方括号创建数组引用,而不是数组)。在打印
行上的连接也有问题:
@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";
}
@myarray=([1,2,3],[4,5,6],[7,8,9]);
对于(my$i=0;$i<@myarray;$i++){
my@firstarray=@{$myarray[$i]};
我的$mystring=join(“,@firstarray”);
打印“我的字符串”。$mystring.。\n”;
}
实际上,您有一个数组的数组
- 外部数组有一个元素,即对数组的引用。
$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");
}
或
[[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};
您需要更改初始化数组的方式,以便外部数组边界使用
()
,内部数组使用[]
,这意味着它们被声明为引用,以后需要转换为其本机数组格式进行处理(my@subarray=@{$myarray[$i]};
)
my@myarray=([1,2,3],[4,5,6],[7,8,9]);
对于(my$i=0;$i<@myarray;$i++)
{
my@subarray=@{$myarray[$i]};
my$subarray str=join(“,@subarray”);
打印$i.“.Subarray Str=“.Subarray Str.”\n”;
}
为什么是“数组的数组”?我看到一个外部数组或三个内部一维数组arrays@amphibient,因为一个数组的元素引用了一个数组的元素引用了3个数组。这是5个数组,而不是4个。如我所示,计算my@
和[]
。记住[…]
基本上是do{my@a=(…);\@a}
。但是如果你有3个内部和一个外部,那就是4个数组,不是吗?此外,我会把它看作是一个简单的AoA[3][3]
@两栖体,是的,如果你有3个内部和一个外部,那就是4个。因为他有5个数组(一个是用my
创建的,另一个是用[]
创建的),他没有3个内部和1个外部。这也可以通过转储程序(\@myarray)看到
。啊,好吧——你是说,按照他声明的方式,他有5个,而他应该正确地有4个,了解Perl引用和去引用。与流行的观点相反,它们几乎完全不同于C风格的指针,在你的示例中,你对它们做了一些奇怪的事情。下面的Perl教程给出了最详细的说明对我所知道的主题的简明处理:使用警告;
--这会提醒您对@myarray
的奇怪初始化。对于引用,我更喜欢核心文档。它使引用更容易理解。@ikegami:我只是尽量靠近原始代码。
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");
}
$myarray = [[1,2,3],[4,5,6],[7,8,9]];
printf "My string %s\n", join(" ", @{$myarray->[0]});
$myarray = [[1,2,3],[4,5,6],[7,8,9]];
map{printf "My string %s\n", join(" ",@{$_})} @{$myarray};
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";
}