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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top