你应该看看Perl references。
在 Perl 5.0 之前的版本中,您拥有三种类型的数据结构,并且您只能在其中存储标量数据。例如,我可以有一个散列,但散列的每个值都可以是字符串或数字。
Perl 5.0 引入了引用。引用是指向另一个数据结构的一段数据。例如,您可以有一个代表服务器的散列。散列的每个成员指向另一个包含用户(或用户列表,如果您愿意)的散列。
例如,您有一个如下所示的哈希:
$system{server1.domain.com} ---> $anon_array[0] = "user1"
$anon_array[1] = "user2"
$anon_array[2] = "user3"
$system{server2.domain.com} ----> $another_anon_array[0] = "user1"
$another_anon_array[1] = "user2"
$another_anon_array[2] = "user3"
$another_anon_array[3] = "user4"
您可以在上面看到%system 哈希的键实际上指向内存中包含用户列表的某个数组。这些数组没有诸如@foo 或@bar 之类的名称。您可以访问它们的唯一方法是通过您的%system 哈希。因此,它们被称为匿名数组。
要创建引用,请在变量前面加上反斜杠:
$my_reference = \%my_hash
现在,$my_reference 指向散列 %my_hash 的成员。如果我想再次将引用变为哈希,我在它前面加上哈希符号(%):
%bar = %{$my_reference};
您可以使用-> 语法来表明某物指向一个引用:
$foo->[0]; Points to the first member of an anonymous array.
$bar = []; #Sets $bar to be a reference to an anonymous array
$foo = {}; #Sets $foo to be a reference to an anonymous hash.
现在,真正的乐趣可以开始了!您现在可以存储整个数据结构,而不是存储单个值。
想象一下这样的事情:
my %system; #Normal hash keyed by domain name
$system{server1} = {}; # This points to an anonymous hash!
$system{server1}->{START} = "20121021T01:00:56";
$system{server1}->{STOP} = "20121021T01:00:56";
$system{server1}->{RETURN} = 0;
$system{server1}->{USERS} = []; #This hash entry points to an anonymous array
$system{server1}->{USERS}->[0] = "user1";
$system{server1}->{USERS}->[1] = "user2";
$system{server1}->{USERS}->[2] = "user3";
server2 以此类推。您有一个哈希%system,它以域名为关键字。 %system 散列中的每个域都有一个 START 时间、STOP 时间、RETURN 值、该系统上的 USERS 列表。 server1 的开始时间是几点?这是$system{server1}->{START}。 system2 的用户列表是什么?它是@{ $system{server2}->{USERS} }(对存储在$system{server2}->{USERS} 中的数组的取消引用)。
需要一些时间来适应这种新的思维方式,但您可以看到它有助于将您的数据作为一个单一的结构保持在一起。
当然,复杂的数据结构会带来保持直截了当的问题。例如:
use strict;
use warnings;
my %server;
$servre{domain1} = "10.10.1.20";
会失败,因为我从未声明过$servre。然而:
use strict;
use warnings;
my $hash = {};
$hash->{SERVRE}->{domain1} = "10.10.1.20";
会工作得很好。在这种情况下,SERVRE 是哈希引用的键,而不是变量。在这种情况下,use strict; 杂注不会检测到我的拼写错误。这将引导您进入下一步:面向对象的 Perl。但是,首先要了解这些新的复杂数据结构以及它们是如何工作的。在您对在程序中使用它们更加熟悉之后,您可以开始研究面向对象编程将如何帮助解决它们造成的混乱。