我有一个哈希,我有两个键,我想使用一个键作为另一个键的值。 Perl有可能吗?
exp:
%hash= (
abs =>[a,b,c,e];
xyz=> abs
);
我试过但是没能做到这一点。
答案 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
。