Perl 中的散列和散列引用有什么区别?
-
08-07-2019 - |
题
我想正确理解 Perl 中的哈希值。我已经间歇性地使用 Perl 相当长一段时间了,而且大多数时候我需要这样做时,它主要与文本处理有关。
每次,我都必须处理哈希值,它就会变得混乱。我发现哈希的语法非常神秘
对哈希和哈希引用、它们的差异、何时需要它们等进行了很好的解释。将不胜感激。
解决方案
简单的哈希接近于数组。它们的初始化甚至看起来很相似。首先是数组:
@last_name = (
"Ward", "Cleaver",
"Fred", "Flintstone",
"Archie", "Bunker"
);
现在让我们用散列(也称为关联数组)表示相同的信息:
%last_name = (
"Ward", "Cleaver",
"Fred", "Flintstone",
"Archie", "Bunker"
);
尽管它们具有相同的名称,但数组 @last_name
和哈希值 %last_name
是完全独立的。
使用数组,如果我们想知道 Archie 的姓氏,我们必须执行线性搜索:
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
都是标量,但值是一种特殊的标量:哈希引用,创建于 {}
. 。这些参考文献使我们能够模拟“多维”哈希。例如,我们可以通过以下方式到达威尔玛
$personal_info{Flintstone}->{SPOUSE}
请注意,Perl 允许我们省略下标之间的箭头,因此上面相当于
$personal_info{Flintstone}{SPOUSE}
如果您想了解有关 Fred 的更多信息,需要输入大量内容,因此您可以获取类似光标的参考:
$fred = $personal_info{Flintstone};
print "Fred's wife is $fred->{SPOUSE}\n";
因为 $fred
上面的代码片段是一个哈希引用,箭头是必要的。如果你忽略它但明智地启用它 use strict
为了帮助您捕获此类错误,编译器会抱怨:
Global symbol "%fred" requires explicit package name at ...
Perl 引用类似于 C 和 C++ 中的指针,但它们永远不能为 null。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
潜艇一回来就会得到一份被扔掉的副本。
另请注意“胖逗号”的使用(=>
) 多于。它自动引用左侧的字符串,并使散列初始化的语法噪音更少。
其他提示
以下演示了如何使用散列和散列引用:
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中的基本数据类型。 它使用密钥来访问其内容。
散列引用是a的缩写 引用哈希。参考文献是 标量,这是简单的价值观。它是 包含的标量值 本质上,指向实际的指针 哈希本身。
链接: perl中的哈希和散列引用之间的区别 - Ubuntu论坛
删除语法也有区别。像C一样,perl对Hashes来说就像这样:
delete $hash{$key};
和Hash References
delete $hash_ref->{$key};
Perl Hash Howto 是一个使用哈希引用来理解哈希与哈希的重要资源
还有另一个链接这里有关于perl和参考的更多信息一>
请参阅 perldoc perlreftut ,也可以在您自己的计算机命令行上访问。
引用是一个标量值,它引用整个数组或整个哈希值(或几乎任何其他哈希值)。名称是您已经熟悉的一种参考。想想美国总统:一堆杂乱,不方便的血和骨头。但是要谈论他,或者在计算机程序中代表他,你所需要的只是简单方便的标量字符串“Barack Obama”。
Perl中的引用类似于数组和哈希的名称。它们是Perl的私人内部名称,因此您可以确定它们是明确无误的。与“巴拉克奥巴马”不同,参考仅指一件事,你总是知道它所指的是什么。如果您有对数组的引用,则可以从中恢复整个数组。如果您有对哈希的引用,则可以恢复整个哈希。但是参考仍然是一个简单,紧凑的标量值。