Perl 内置了三种不同的数据类型:
- 标量(如
$foo
)。
- 数组(如 中
@foo
)。
- 哈希(如
%foo
)。
问题是这些中的每一个都处理单个数据位。当然,列表和散列中可以有很多项目,但它们是很多单比特数据。
假设我想跟踪人们。人们有名字、姓氏、电话等。让我们定义一个人:
my %person;
$person{FIRST_NAME} = "Bob";
$person{LAST_NAME} = "Smith";
$person{PHONE_NUMBER} = "555-1234";
好的,现在我需要存储另一个人。我要创建另一个哈希吗?如果我可以说一个散列数组,每个散列代表一个人怎么办?
Perl 允许您通过引用散列来做到这一点:
my @list;
push @list, \%person;
这\%person
是我对包含我的哈希的内存位置的引用。$list[0]
指向那个内存位置,并允许我通过取消引用来访问那个人。
现在,我的数组包含我的人。我可以创建第二个:
$person{FIRST_NAME} = "Susan";
$person{LAST_NAME} = "Brown";
$person{PHONE_NUMBER} = "555-9876";
push @list, \%person.
好的,我如何引用我的人。在 Perl 中,您可以通过在引用前面放置正确的符号来取消引用。例如:
my $person_ref = @list[0]; #Reference to Bob's hash
my %person = %{person_ref}; #Dereference to Bob's hash. %person is now Bob.
有几件事,我做了很多将数据从一个变量移动到另一个变量的工作,但我并没有真正使用这些变量。让我们消除变量,或者至少消除它们的名称:
my @list;
push @list, {}; #Anonymous hash in my list
$list[0]
仍然指向对散列的引用,但我不必为该散列命名。现在,我如何将 Bob 的信息放入其中?
如果$list[0]
是对哈希的引用,我可以通过放置它来取消引用%{...}
它!
%person = %{ $list[0] }; #Person is an empty hash, but you get the idea
让我们填满那个哈希!
${ $list[0] }{FIRST_NAME} = "Bob";
${ $list[0] }{LAST_NAME} = "Smith";
${ $list[0] }{PHONE_NUMBER} = "555-1234";
这很容易阅读...
幸运的是,Perl 提供了一些语法甜味剂。这是一样的:
$list[0]->{FIRST_NAME} = "Bob";
$list[0]->{LAST_NAME} = "Smith";
$list[0]->{PHONE_NUMBER} = "555-1234";
->
运算符指向您正在执行的取消引用。
此外,在某些情况下,我不需要{...}
花括号。把它想象成有优先顺序的数学运算:
(3 x 4) + (5 x 8)
是相同的:
3 x 4 + 5 x 8
一个,我指定操作顺序,另一个我没有:
原始将名称添加到存储在列表中的哈希引用中:
${ $list[0] }{FIRST_NAME} = "Bob";
${ $list[0] }{LAST_NAME} = "Smith";
${ $list[0] }{PHONE_NUMBER} = "555-1234";
可以改写为:
$list[0]{FIRST_NAME} = "Bob";
$list[0]{LAST_NAME} = "Smith";
$list[0]{PHONE_NUMBER} = "555-1234";
(而且我不必先做push @list, {};
。我只是想强调这是对哈希的引用。
因此:
$trades{$id}
是对数据数组的引用。
可以这样想:
my @list = qw(a bunch of data);
$trades{$id} = \@list;
为了取消对列表的引用,我这样做:
@{交易{$id}}
请参阅Mark 关于参考的简短教程。