在Perl中,数组的数组、哈希的哈希和其他复杂数据结构是通过引用构建的。这种方法允许轻松创建层次结构/分支结构,但在访问、复制和修改时需要小心,因为默认情况下记住的是引用,而不是内容。
最初,Perl只支持扁平数组和哈希,没有嵌套。后来的链接支持,使得构建任何组合成为可能:数组的数组、哈希的哈希、树形结构、图形等。
与复杂结构的工作需要记住,访问、写入和复制操作是针对引用的。由于元素和元素的引用之间的混淆,错误经常发生。这会导致无数的bug,例如,如果同一引用被程序的多个部分同时使用,在一个地方更改数据会反映在整个结构上。
创建数组的数组:
my @matrix; for my $i (0..2) { for my $j (0..2) { $matrix[$i][$j] = $i * $j; } } print $matrix[1][2]; # 2
对于哈希的哈希:
my %data; $data{'user1'}{'name'} = 'Alex'; $data{'user1'}{'age'} = 20;
混合结构:
my %complex = ( 'list' => [1, 2, 3], 'map' => { foo => 'bar' }, );
如果尝试将一个数组赋值给另一个以复制结构,会发生什么?
这样的赋值不会复制嵌套结构,只复制对它们的引用(即发生了“浅复制”)。
my @a = ([1,2], [3,4]); my @b = @a; $a[0][0] = 99; printf "$b[0][0] "; # 输出99,因为 @b 包含对与 @a 相同的数组的引用
$array[$i] vs $array->[$i] 作为元素的访问有什么区别?
第一种方法在我们有一个数组时有效,第二种方法当我们有一个引用数组的标量时有效。对于嵌套结构,最常用的语法是箭头($foo->[0])。
为什么不能简单地通过标准Perl中的dclone复制结构?
因为dclone不包含在Perl的基本安装中。对于复杂结构的深层复制,使用模块Storable和函数dclone:
use Storable 'dclone'; my $deep_copy = dclone(\%complex);
在项目中,通过常规赋值(@copy = @org)复制数组的数组,但在一系列更改之后,突然发现“原始”的数据与副本一起发生了变化。
优点:
缺点:
使用模块Storable和函数dclone明确复制数组和哈希,并在代码中明确记录,并明确区分哪里是引用,哪里不是引用。
优点:
缺点: