加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl:定义哈希引用相同的哈希,$this – > {key}?

发布时间:2020-12-15 23:35:58 所属栏目:大数据 来源:网络整理
导读:我将如何创建如下的哈希: my %hash = (key1="Something",key2=$hash{key1} . "Else"); 当我声明哈希时,这不能做到吗?到目前为止,我唯一想到的是: my %hash = (key1="Something");$hash{key2} = $hash{key1} . "Else"; 解决方法 为什么不使用中间变量? my
我将如何创建如下的哈希:

my %hash = (key1=>"Something",key2=>$hash{key1} . "Else");

当我声明哈希时,这不能做到吗?到目前为止,我唯一想到的是:

my %hash = (key1=>"Something");
$hash{key2} = $hash{key1} . "Else";

解决方法

为什么不使用中间变量?

my $common_value = 'Something';
my %some_hash = ( k1 => $common_value,k2 => $common_value.'Else' );

更新

kemp问我们为什么需要一个中间变量.我可以用两种方式解释这个问题,我会尽力回答这两种解释.

>为什么你不能做我的%hash =(k1 =>’foo’,k2 => $hash {k1}.’bar’);?

表达式的右侧(rhs)在左侧(lhs)之前进行评估.因此,当确定k2的值时,尚未发生对%hash的分配.事实上,%hash甚至还没有创建并输入到暂存区. (%hash是一个词法变量,所以它不会进入符号表.)
>为什么使用变量而不是另一种方法?

好吧,有很多方法可以用这样的值初始化哈希.如果我有少量相关的键进行初始化,我会使用一个中间变量.

my $cv1 = sub_result() * 5;
my $cv2 = "Number: $cv1";

my %h = (
    k1 => $cv1,k2 => $cv2,k3 => "Numero: $cv1",k4 => "Big $cv2",k5 => "Round $cv2",k6 => "Whole $cv2",k7 => "-$cv1",);

但是,如果我必须构建许多依赖于许多不同键的复杂值,我可能会使用数据驱动方法来初始化哈希.确切的实现将取决于我没有的细节,但它可能看起来像这样:

use Scalar::Util qw(reftype);

my @init = ( 
    [ key1 => $value                 ],[ key2 => &;make_a_value,'key1' ],[ key3 => &;another_way,'key2' ],);

my %h; 
for my $spec ( @init ) {
    my $key   = shift @$spec;
    my $value = shift @$spec;
    my @args  = @$spec;

    if( reftype $value eq reftype sub {} ) {
        $value = $value->( @h{ @args } );
    }

    $h{$key} = $value;
}

对于这个问题所针对的任何情况,选择使用什么技术取决于许多对该实例特殊的细节.因此,我们必须做出通用陈述.中间变量是解决OP问题的一种好方法.他们是否应该在他的特定情况下使用,我不能说.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读