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

我将如何创建如下的哈希:

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问题的一种好方法.他们是否应该在他的特定情况下使用,我不能说.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...