如何将哈希中的一个键用于另一个键的值



我有一个散列,我有两个键,我想用一个键作为另一个键的值。这在Perl中可能吗?

exp:

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

我试过了,但没能做到。

您可以使用任何您想要的值作为哈希值,包括另一个键的名称。然而,你不能不引用这个值,因为它不像密钥那样自动引用:

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) ]

您可能还注意到,分号;不是哈希赋值中的有效字符。括号内的键/值对应使用逗号分隔,不使用其他字符。

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

#!/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);

首先,始终使用

use strict;
use warnings;

那么,这应该起作用:

my %hash = (
    abs => [ qw(a b c) ],
    xyz => 'abs',
);
print $hash{ $hash{xyz} }[0];
# prints 'a'

一个问题是,在定义哈希时,它是匿名的。直到解析完整个列表后,才将其分配给%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}引用的数组的元素(包括添加和删除元素(。

此代码不编译。

下面是一个工作示例:

#!/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

相关内容

最新更新