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