如何在哈希中使用键作为另一个键的值

时间:2013-05-28 15:14:48

标签: perl

我有一个哈希,我有两个键,我想使用一个键作为另一个键的值。 Perl有可能吗?

exp:

%hash= (
        abs =>[a,b,c,e];
        xyz=> abs
      );

我试过但是没能做到这一点。

5 个答案:

答案 0 :(得分:2)

您只是使用了错误的语法。试试这个:

#!/usr/bin/env perl

# warnings and strict are ALWAYS a good idea in perl code
use warnings;
use strict;

my %hash = ( 
        abs => ['a', 'b','c','e'], # make strings clear and use a comma, no semicolon
        xyz => 'abs'
);

如果你想打印出你的哈希,只是为了检查它,Data::Dumper是有用的 - 特别是一旦你有更大的哈希值:

use Data::Dumper;
print Dumper(\%hash);

答案 1 :(得分:2)

您可以使用您希望的任何值作为哈希值,包括另一个键的名称。但是,您不能引用该值,因为它不像键那样自动引用:

my %hash = (
    abs => 'foo',
    xyz => 'abs'
);

如果不包含空格,则引用=>之前的参数是可选的。引用它后面的参数不是。

您可能也有兴趣知道

[a,b,c,d]
如果你打开了警告(

),

会产生警告。

Unquoted string "a" may clash with future reserved word at
Unquoted string "b" may clash with future reserved word at

这仍然“有效”的原因 - 就我所知 - 是为了向后兼容,你应该总是引用你的字符串。此外,例如,您的裸字abs实际上被误认为是内置函数abs,在这种情况下会尝试查找$_的绝对值,并且可能会失败,返回0(并在$_中发出有关未定义值的警告)。

你的数组引用应该是这样的:

['a', 'b', 'c', 'd']

或者使用更简单的语法,使用qw()运算符:

[ qw(a b c d) ]

您可能还会注意到,分号;不是散列赋值中的有效字符。括号内的键/值对应用逗号分隔,没有别的。

答案 2 :(得分:1)

首先,始终使用

use strict;
use warnings;

然后,这应该工作:

my %hash = (
    abs => [ qw(a b c) ],
    xyz => 'abs',
);

print $hash{ $hash{xyz} }[0];

# prints 'a'

答案 3 :(得分:1)

一个问题是,在定义散列时,它是匿名的。直到解析整个列表才将其分配给%hash,因此在定义散列时,实际上无法引用散列的早期部分。有几种解决方法可供选择:

my $common_lref = ['a', 'b', 'c', 'e'];
my %hash = ( abs => $common_lref, xyz => $common_lref );

my %hash = ( abs => ['a', 'b', 'c', 'e'] );
$hash{xyz} = $hash{abs};

在这两种情况下,更改$hash{abs}引用的数组会更改$hash{xyz},反之亦然。

注意:这仅在值是引用时才有效(如此处所示),并且仅在您不更改$hash{abs}$hash{xyz}时才有效。您仍然可以更改$hash{abs}$hash{xyz}引用的数组元素(包括添加和删除元素)。

答案 4 :(得分:0)

此代码无法编译。

这是一个有效的例子:

#!/usr/bin/perl

use strict; 
use warnings;

my %hash = ( 
        abs => ['a', 'b','c','e'],
        xyz=> 'abs'
      );

print "abs: @{ $hash{$hash{xyz}} }\n";

首先,使用use warnings; use strict;

您必须在xyz =>引用您的价值。附注:abs也是内置的perl。

您还需要在abs =>

引用您的匿名数组值
Eg, `[ qw(a b c) ]` or `['a', 'b', 'c',]`. 

然后在打印中,我取消引用(@{})值,因为它是list