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 $lnamen"; 使用哈希,语法上更直接: print "Archie $last_name{Archie}n"; 假设我们想要表示只有稍微更丰富的结构的信息: > Cleaver(姓氏) >病房(名) > Flintstone >弗雷德 > 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”(=>)。它自动引用其左侧的字符串,使哈希初始化的语法噪声较少。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |