Perl:在这种情况下可以跳过中间哈希变量吗?

格奥尔格

此刻,我使用这样的东西:

my %tmpHash = routineReturningHash();
my $value = $tmpHash{'someKey'};

我唯一需要的是$value,我自己不需要%tmpHash因此,我很想知道是否有一种避免声明的方法%tmpHash

我试过了

my $value = ${routineReturningHash()}{'someKey'};

但它不起作用,并输出一个奇怪的错误:“ Can't use string ("1/256") as a HASH ref while "strict refs" in use”。

有什么想法可以做到吗?

出租

从返回的列表中创建一个hashref,然后可以取消引用

my $value = { routineReturningHash() }->{somekey};

在您尝试的过程中,${ ... }将标量上下文强加于其中。来自perlref(我的重点)

2.   在将标识符(或标识符链)作为变量或子例程名称的一部分放置的任何位置,都可以用返回正确类型引用BLOCK替换标识符

在标量上下文中,哈希被评估为一个字符串,其分数涉及桶; 不是hashref。


更新   我认为有设计上的理由将哈希作为平面列表返回。如果不是这种情况,那么明确的解决方案是仅从子级返回一个hashref。

这样也可以保存数据副本:当您返回哈希时,需要复制标量(键和值),以提供给调用方一个列表;当您返回引用时,仅返回一个标量。

至于性能优势……如果您能看到差异,则要么有大量的散列,无论如何都应通过引用来处理,或者太多的函数调用可能需要重构。

要通过引用返回,您可以

  • 形成并在子中使用哈希,然后 return \%hash;

  • 直接形成hashref return { key => 'value', ... };

  • 如果您需要处理大量的哈希,请传递其引用并进行处理

    sub work_by_ref {    
        my ($hr) = @_;
        $hr->{key} = 'value';
        return 1;
    }
    
    my %hash;
    work_by_ref(\%hash);
    say "$_ => $hash{$_}" for sort keys %hash;
    

    使用这种C风格的方法时要小心;在Perl中直接更改调用者的数据并不常见。如果您只需要在子代码中填充哈希,则在其中构建它,然后return \%hash;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

来自分类Dev

在这种情况下,可变哈希表是否足够?

来自分类Dev

在这种情况下,局部变量会占用内存吗?

来自分类Dev

我可以在这种情况下避免使用纯纯虚函数吗?

来自分类Dev

在这种情况下我可以正确使用flex吗?

来自分类Dev

在这种特殊情况下,我可以使用Nginx作为反向代理吗?

来自分类Dev

打字稿可以在这种情况下做联合类型断言吗?

来自分类Dev

在这种情况下,我可以参考该键吗?

来自分类Dev

C#“使用”语句后跟try语句在这种情况下可以忽略括号吗?

来自分类Dev

我是C ++的新手,可以在这种情况下解释指针吗

来自分类Dev

在这种情况下,我可以避免变异吗?

来自分类Dev

在这种情况下,itertools可以用于数量不确定的尺寸吗?

来自分类Dev

在这种情况下,如何更改变量的值?

来自分类Dev

在这种情况下,数组会取消分配吗?

来自分类Dev

Go:在这种情况下需要频道吗?

来自分类Dev

Swift在这种情况下会复制突变吗?

来自分类Dev

在这种情况下应避免附着吗?

来自分类Dev

Perl:在这种特殊情况下,哈希不允许使用字母数字键

来自分类Dev

在这种特定情况下,我们可以使用android数据绑定替换findViewById()吗?

来自分类Dev

警告C4309-这是什么意思,在这种情况下可以忽略吗?

来自分类Dev

在这种情况下,simpletype无效

来自分类Dev

在这种情况下如何撰写

来自分类Dev

在这种情况下,什么是“生成”?

来自分类Dev

在这种情况下的SSIS性能

来自分类Dev

在这种情况下,`malloc()`的要求

来自分类Java

在这种情况下,中间流和终端流方法如何工作

来自分类Dev

在这种情况下,如何摆脱用于递归函数的全局变量?

来自分类Java

在这种情况下,为什么不能在lambda中引用变量?

来自分类Dev

在这种情况下,为什么ghci不提供预期的歧义类型变量错误?

来自分类Dev

在这种情况下如何避免全局变量(嵌入式C)

TOP 榜单

热门标签

归档