每次,我必须处理哈希,它搞乱了。我发现语法对于哈希是非常隐蔽的
对散列和散列引用,它们的差异,当他们需要时,很好的解释。
解决方法
@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”(=>)。它自动引用其左侧的字符串,使哈希初始化的语法噪声较少。