您应该查看Perl 参考资料。
在 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
or @bar
。您可以访问它们的唯一方法是通过您的%system
哈希。因此,它们被称为匿名数组。
要创建引用,请在变量前面放置一个反斜杠:
$my_reference = \%my_hash
现在,$my_reference
指向hash的成员%my_hash
。如果我想再次将引用变成哈希,我在它前面加上哈希符号(the %
):
%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。但是,首先要了解这些新的复杂数据结构以及它们是如何工作的。在您在程序中使用它们变得更加舒适之后,您可以开始研究面向对象编程将如何帮助驯服它们造成的混乱。