我想正确理解Perl中的哈希值。我不得不间歇性地使用Perl很长一段时间,而且大多数时候我需要这样做,它主要与文本处理有关。
每次,我都要处理哈希,它会搞砸了。我觉得哈希的语法非常神秘
对哈希和哈希引用的详细解释,它们之间的差异,如果需要等等,将非常感激。
答案 0 :(得分:86)
简单的哈希接近数组。他们的初始化甚至看起来相似。首先是数组:
@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
是hashref,因此需要箭头。如果你把它遗漏但明智地启用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
会得到一个副本,一旦子返回就会被丢弃。
另请注意上面使用的“胖逗号”(=>
)。它自动引用其左侧的字符串,并使哈希初始化在语法上更加嘈杂。
答案 1 :(得分:16)
以下演示了如何使用散列和散列引用:
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";
答案 2 :(得分:10)
哈希是Perl中的基本数据类型。 它使用密钥来访问其内容。
散列引用是a的缩写 引用哈希。参考文献是 标量,这是简单的价值观。它是 包含的标量值 本质上,指向实际的指针 哈希本身。
链接:difference between hash and hash ref in perl - Ubuntu Forums
删除语法也有区别。像C一样,perl对Hashes来说就像这样:
delete $hash{$key};
和Hash References
delete $hash_ref->{$key};
Perl Hash Howto是了解使用哈希引用哈希与哈希的重要资源
还有另一个链接here that has more information on perl and references。
答案 3 :(得分:7)
请参阅perldoc perlreftut,这也可以在您自己的计算机命令行中访问。
引用是一个标量值,它引用整个数组或整个哈希值(或几乎任何其他哈希值)。名称是您已经熟悉的一种参考。想想美国总统:一堆杂乱,不方便的血和骨头。但是要谈论他,或者在计算机程序中代表他,你所需要的只是简单方便的标量字符串“Barack Obama”。
Perl中的引用类似于数组和哈希的名称。它们是Perl的私人内部名称,因此您可以确定它们是明确无误的。与“巴拉克奥巴马”不同,参考只涉及一件事,你总是知道它所指的是什么。如果您有对数组的引用,则可以从中恢复整个数组。如果您有对哈希的引用,则可以恢复整个哈希。但是参考仍然是一个简单,紧凑的标量值。