2

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

经验:

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

我试过但无法做到这一点。

4

5 回答 5

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);
于 2013-05-28T15:22:00.727 回答
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(并发出关于 中未定义值的警告$_)。

你的数组 ref 应该是这样的:

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

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

[ qw(a b c d) ]

您可能还会注意到,分号;在分配给散列的内容中不是有效字符。括号内的键/值对应以逗号分隔,仅此而已。

于 2013-05-28T15:24:06.033 回答
1

首先,始终使用

use strict;
use warnings;

那么,这应该工作:

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

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

# prints 'a'
于 2013-05-28T15:23:01.040 回答
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}在这两种情况下,更改由changes引用的数组$hash{xyz},反之亦然。

注意:这仅在值是引用时才有效(因为它在这里),并且只有在您不更改$hash{abs}或时才有效$hash{xyz}。您仍然可以更改$hash{abs}and引用的数组的元素$hash{xyz}(包括添加和删除元素)。

于 2013-05-28T15:29:33.087 回答
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.

于 2013-05-28T15:22:51.403 回答