Perl中的哈希引用和哈希引用有什么区别?

时间:2009-11-30 01:02:46

标签: perl hash language-features hash-reference

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

每次,我都要处理哈希,它会搞砸了。我觉得哈希的语法非常神秘

对哈希和哈希引用的详细解释,它们之间的差异,如果需要等等,将非常感激。

4 个答案:

答案 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";

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

  • Cleaver(姓氏)
    • Ward(名字)
    • 六月(配偶的名字)
  • 打火石
    • 佛瑞德
    • 威尔玛
    • 阿奇
    • 伊迪丝

在引用出现之前,平键值哈希是我们能做的最好的,但是引用允许

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

在内部,%personal_info的键和值都是标量,但值是一种特殊的标量:使用{}创建的哈希引用。参考允许我们模拟“多维”哈希。例如,我们可以通过

访问Wilma
$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";

另见perldoc perldsc

答案 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的私人内部名称,因此您可以确定它们是明确无误的。与“巴拉克奥巴马”不同,参考只涉及一件事,你总是知道它所指的是什么。如果您有对数组的引用,则可以从中恢复整个数组。如果您有对哈希的引用,则可以恢复整个哈希。但是参考仍然是一个简单,紧凑的标量值。