我将如何创建如下的哈希:
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问题的一种好方法.他们是否应该在他的特定情况下使用,我不能说.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。