Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何将foreach与哈希引用一起使用?_Perl_Hash - Fatal编程技术网

Perl 如何将foreach与哈希引用一起使用?

Perl 如何将foreach与哈希引用一起使用?,perl,hash,Perl,Hash,我有这个密码 foreach my $key (keys %ad_grp) { # Do something } 这很有效 如果我没有%ad\u grp,但是有一个对散列的引用,$ad\u grp\u ref,那么这会是什么样子 foreach my $key (keys %$ad_grp_ref) { ... } Perl::Critic和daxim推荐这种风格 foreach my $key (keys %{ $ad_grp_ref }) { ... } 出于

我有这个密码

foreach my $key (keys %ad_grp) {

    # Do something
}
这很有效

如果我没有
%ad\u grp
,但是有一个对散列的引用,
$ad\u grp\u ref
,那么这会是什么样子

foreach my $key (keys %$ad_grp_ref) {
    ...
}
Perl::Critic
和daxim推荐这种风格

foreach my $key (keys %{ $ad_grp_ref }) {
    ...
}

出于对可读性和维护的考虑(这样当您需要使用
%{$ad\u grp\u obj[3]->get\u ref()}
而不是
%{$ad\u grp\u ref}
时,您就不必费劲地考虑要更改什么了)

正如其他人所说的,您必须取消引用。
函数要求其参数以%开头:

我喜欢:

foreach my $key (keys %{$ad_grp_ref}) {
根据:

猜猜你该听谁的

你可能想通读这本书

如果你发现自己做了很多关于散列、列表散列和散列列表的引用,你可能想开始考虑使用。在Perl文档中有。在Perl 5.14中(它现在在Perl 5.13中工作),我们可以


因此,对于Perl 5.20,新的答案是:

foreach my $key (keys $ad_grp_ref->%*) {
(其优点是可以透明地处理更复杂的表达式:

foreach my $key (keys $ad_grp_obj[3]->get_ref()->%*) {
)

有关完整文档,请参阅

注意:在Perl版本5.20和5.22中,这种语法被认为是实验性的,因此您需要

use feature 'postderef';
no warnings 'experimental::postderef';

在使用它的任何文件的顶部。Perl 5.24及更高版本不需要任何pragmas来实现此功能。

如果您教授更好的样式,您会从我这里得到更多的支持:这不是更好,那更糟。另外,可能非常有用我完全同意ysth,没有理由让表达式变得比需要的更复杂。
keys%$ad_grp_ref
更可读,尤其是当被其他环绕运算符包围时。正如你所看到的,Sandra,有不止一种方法可以做到这一点。您需要
使用5.14.0
或类似的工具,以确保您的脚本不会尝试在太旧的Perl版本上运行,而无法使用这种语法(当然也可以使用任何5.13.X版本)。很好,我应该在代码示例中说明这一点。修改。
标量上的实验键现在被禁止
。此功能已在5.22中删除。(ish)可能的副本
foreach my $key (keys $ad_grp_obj[3]->get_ref()->%*) {
use feature 'postderef';
no warnings 'experimental::postderef';