Perl中的散列和散列引用有什么区别?

前端之家收集整理的这篇文章主要介绍了Perl中的散列和散列引用有什么区别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想正确理解Perl中的哈希。我不得不间歇地使用Perl相当一段时间,主要是当我需要做它,它主要与文本处理相关。

每次,我必须处理哈希,它搞乱了。我发现语法对于哈希是非常隐蔽的

对散列和散列引用,它们的差异,当他们需要时,很好的解释。

解决方法

一个简单的哈希值接近数组。它们的初始化甚至看起来类似。首先是数组:
@last_name = (
  "Ward","Cleaver","Fred","Flintstone","Archie","Bunker"
);

现在让我们用一个哈希(也就是关联数组)来表示相同的信息:

%last_name = (
  "Ward","Bunker"
);

尽管它们具有相同的名称,但是数组@last_name和hash%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(姓氏)

>病房(名)
> 6月(配偶的名字)

> Flintstone

>弗雷德
> Wilma

> Bunker

> Archie
>伊迪丝

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

my %personal_info = (
    "Cleaver",{
        "FIRST","Ward","SPOUSE","June",},"Wilma","Bunker","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,所以箭头是必要的。如果你离开它但明智地启用使用strict来帮助你捕获这些类型的错误,编译器会抱怨:

Global symbol "%fred" requires explicit package name at ...

Perl引用类似于C和C中的指针,但它们永远不能为空。 C和C中的指针需要取消引用,因此在Perl中引用。

C和C函数参数具有pass-by-value语义:它们只是副本,因此修改不会返回到调用者。如果你想看到的变化,你必须传递一个指针。你可以得到这个效果与参考在Perl:

sub add_barney {
    my($personal_info) = @_;

    $personal_info->{Rubble} = {
        FIRST  => "Barney",SPOUSE => "Betty",};
}

add_barney \%personal_info;

没有反斜杠,add_barney会得到一个拷贝,一旦子返回就丢弃。

还要注意使用上面的“fat comma”(=>)。它自动引用其左侧的字符串,使哈希初始化的语法噪声较少。

原文链接:https://www.f2er.com/Perl/173488.html

猜你在找的Perl相关文章