理解Perl中的引用

Bio*_*Rod 4 perl

我正在尝试理解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)

sim*_*que 8

声明哈希%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中创建多级数据结构,需要参考.但第一级不需要作为参考.它可以是散列或数组.

  • 在Perl中使用`my`声明一个词法变量也初始化它.标量初始化为undef,哈希和数组初始化为空. (3认同)
  • 自动生化的链接帮助很多. (2认同)

ike*_*ami 7

%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)

文档: