理解Perl中的引用

时间:2016-10-31 20:11:46

标签: perl

我试图理解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;

2 个答案:

答案 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' ] );

文档: