我试图理解Perl中引用的教程
perldoc perlreftut
到目前为止,使用下面的代码,我用
初始化空哈希my %table
这是整个计划
#!/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
有人可以向我解释下面这一行,因为我很困惑,因为我在这里看到了一个引用(我认为),但它被初始化为带有%table的哈希。
push @{$table{$country}}, $city;
答案 0 :(得分:8)
你是declaring哈希%table
。 声明就是告诉Perl有一个词法范围的变量。 初始化是指您第一次为变量赋值。你没有initialize它,所以Perl提出了一个默认值。因为它是一个哈希值,所以它以空列表()
开头,相当于 false 。
你在这一行中确实有一个解除引用运算符。
push @{$table{$country}}, $city;
它表示将值$table{$country}
作为数组引用,取消引用它,然后将$city
推送到该数组中。有一个名为auto-vivification的功能可以在推送值之前自动创建必要的数组引用。
因此,在输入的第一轮之后,您现在拥有了这个数据结构:
%table = ( 'USA' => [ 'Chicago' ] )
%table
是一个哈希,但该哈希中的键USA
包含一个数组引用。
要在Perl中创建多级数据结构,需要参考。但第一级不需要作为参考。它可以是散列或数组。
答案 1 :(得分:7)
%table
是哈希,
$table{$country}
是对数组的引用,以及
@{ $table{$country} }
是引用的数组。
这个数据结构是“对数组的引用的哈希”,虽然它简称为“数组的哈希”,它的缩写为“HoA”。
但是引用和数组来自哪里?它们是自动生成的,这意味着当您将$table{$country}
视为对数组的引用时,Perl会为您创建它们。
换句话说,
push @{ $table{$country} }, $city
是
的缩写push @{ $table{$country} //= [] }, $city
因此,在第一个push
之后,您将从拥有空哈希到拥有
%table = ( 'USA' => [ 'Chicago' ] );
文档: