Perl中的散列和散列引用有什么区别?

我想正确理解Perl中的哈希。 我不得不间歇地使用Perl一段时间,大多数时候我需要这样做,这主要与文本处理有关。

每一次,我都必须处理哈希,它会变得混乱。 我发现哈希的语法非常隐秘

散列和散列引用的一个很好的解释,它们的区别,当它们是需要的时候,将非常感激。

一个简单的散列靠近一个数组。 他们的初始化甚至看起来相似。 首先是arrays:

@last_name = ( "Ward", "Cleaver", "Fred", "Flintstone", "Archie", "Bunker" ); 

现在我们用一个散列(又名关联数组)表示相同的信息:

 %last_name = ( "Ward", "Cleaver", "Fred", "Flintstone", "Archie", "Bunker" ); 

尽pipe它们具有相同的名称,但是数组@last_name和哈希%last_name是完全独立的。

有了这个数组,如果我们想知道Archie的姓氏,我们必须执行一个线性search:

 my $lname; for (my $i = 0; $i < @last_name; $i += 2) { $lname = $last_name[$i+1] if $last_name[$i] eq "Archie"; } print "Archie $lname\n"; 

使用散列,语法上更直接:

 print "Archie $last_name{Archie}\n"; 

假设我们想用仅稍微更丰富的结构来表示信息:

  • 切割者(姓氏)
    • 病房(名)
    • 六月(配偶的名字)
  • 打火石
    • 弗雷德
    • 威尔玛
  • 掩体
    • 阿奇
    • 伊迪丝

在引用出现之前,平键值散列是我们可以做的最好的,但引用允许

 my %personal_info = ( "Cleaver", { "FIRST", "Ward", "SPOUSE", "June", }, "Flintstone", { "FIRST", "Fred", "SPOUSE", "Wilma", }, "Bunker", { "FIRST", "Archie", "SPOUSE", "Edith", }, ); 

在内部, %personal_info的键和值都是标量,但这些值是一种特殊的标量:使用{}创build的哈希引用。 这些引用使我们能够模拟“多维”哈希。 例如,我们可以通过Wilma

 $personal_info{Flintstone}->{SPOUSE} 

请注意,Perl允许我们省略下标之间的箭头,所以上面相当于

 $personal_info{Flintstone}{SPOUSE} 

如果您想了解有关Fred的更多信息,那么可以input很多内容,因此您可以使用某种游标来获取引用:

 $fred = $personal_info{Flintstone}; print "Fred's wife is $fred->{SPOUSE}\n"; 

因为上面代码片段中的$fred是一个hashref,所以箭头是必须的。 如果你把它放开,但明智地use strict来帮助你捕捉这些types的错误,编译器会抱怨:

 Global symbol "%fred" requires explicit package name at ... 

Perl引用类似于C和C ++中的指针,但是它们不能为空。 C和C ++中的指针需要解引用,所以在Perl中引用也是如此。

C和C ++函数参数具有按值传递的语义:它们只是副本,所以修改不会返回给调用者。 如果你想看到更改,你必须传递一个指针。 你可以用Perl中的引用来获得这个效果:

 sub add_barney { my($personal_info) = @_; $personal_info->{Rubble} = { FIRST => "Barney", SPOUSE => "Betty", }; } add_barney \%personal_info; 

如果没有反斜杠, add_barney会得到一个副本,只要子副本返回就会被丢弃。

还要注意使用上面的“胖逗号”( => )。 它自动引用左边的string,使得哈希初始化的语法更less。

以下演示如何使用散列和散列引用:

 my %hash = ( toy => 'aeroplane', colour => 'blue', ); print "I have an ", $hash{toy}, " which is coloured ", $hash{colour}, "\n"; my $hashref = \%hash; print "I have an ", $hashref->{toy}, " which is coloured ", $hashref->{colour}, "\n"; 

另请参阅perldoc perldsc 。

散列是Perl中的基本数据types。 它使用键来访问其内容。

哈希引用是哈希引用的缩写。 引用是标量,这是简单的值。 这是一个标量值,它本质上包含一个指向实际散列本身的指针。

链接: 在散列和散列参考之间的区别 – Ubuntu论坛

删除的语法也有所不同。 像C一样,perl对于Hashes是这样工作的:

 delete $hash{$key}; 

和哈希引用

 delete $hash_ref->{$key}; 

Perl Hash Howto是理解散列与散列引用哈希的好资源

这里还有另外一个链接,它提供了有关perl和引用的更多信息 。

请参阅perldoc perlreftut ,这也可以在您自己的计算机的命令行上访问。

引用是一个标量值,指的是整个数组或整个散列(或其他任何东西)。 名字是你已经熟悉的一种参考。 想想美国总统:一团混乱,不便的血袋和骨头。 但是要谈论他,或者用计算机程序来代表他,所有你需要的是简单,方便的标量string“奥巴马”。

Perl中的引用就像数组和哈希的名字。 它们是Perl的私有名称,所以您可以确定它们是明确的。 与“奥巴马”不同,参考文献只涉及一件事情,而且你总是知道它是指什么。 如果你有一个数组的引用,你可以从中恢复整个数组。 如果你有一个散列引用,你可以恢复整个散列。 但是这个参考仍然是一个简单而紧凑的标量值。