我正在尝试理解Perl中的引用教程
perldoc perlreftut
Run Code Online (Sandbox Code Playgroud)
到目前为止,使用下面的代码,我正在初始化一个空哈希
my %table
Run Code Online (Sandbox Code Playgroud)
这是整个计划
#!/usr/bin/perl -w
use strict;
my %table;
while (<DATA>) {
chomp;
my ($city, $country) = split /, /;
#$table{$country} = [] unless exists $table{$country};
push @{$table{$country}}, $city;
print @{$table{$country}};
}
__DATA__
Chicago, USA
Frankfurt, Germany
Berlin, Germany
Washington, USA
Helsinki, Finland
New York, USA
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释下面这一行,因为我很困惑,因为我在这里看到一个引用(我认为),但它被初始化为带有%table的哈希.
push @{$table{$country}}, $city;
Run Code Online (Sandbox Code Playgroud)
您声明哈希%table
.该声明是当你告诉Perl有一个词法范围的变量.初始化是指您第一次为变量赋值.你没有初始化它,所以Perl提出了一个默认值.因为它是一个哈希值,所以它以一个空列表开头()
,这个值等于false.
你在这一行中有一个解引用运算符.
push @{$table{$country}}, $city;
Run Code Online (Sandbox Code Playgroud)
它表示将值$table{$country}
作为数组引用,取消引用它,然后$city
进入该数组.有一个名为auto-vivification的功能,可以在推送值之前自动创建必要的数组引用.
因此,在输入的第一轮之后,您现在拥有以下数据结构:
%table = ( 'USA' => [ 'Chicago' ] )
Run Code Online (Sandbox Code Playgroud)
%table
是一个哈希,但该哈希中的键USA
包含一个数组引用.
要在Perl中创建多级数据结构,需要参考.但第一级不需要作为参考.它可以是散列或数组.
%table
是一个哈希,
$table{$country}
是对数组
@{ $table{$country} }
的引用,是引用的数组.
这个数据结构是"对数组的引用的哈希",虽然它简称为"数组的哈希",它的缩写为"HoA".
但是引用和数组从何而来?它们是自动生成的,这意味着Perl在您被$table{$country}
视为对数组的引用时为您创建它们.
换一种说法,
push @{ $table{$country} }, $city
Run Code Online (Sandbox Code Playgroud)
是的缩写
push @{ $table{$country} //= [] }, $city
Run Code Online (Sandbox Code Playgroud)
所以,在第一个之后push
,你将从拥有空哈希变为拥有哈希
%table = ( 'USA' => [ 'Chicago' ] );
Run Code Online (Sandbox Code Playgroud)
文档: