我有一个哈希,我有两个键,我想用一个键作为另一个键的值。在 Perl 中可以吗?
经验:
%hash= (
abs =>[a,b,c,e];
xyz=> abs
);
我试过但无法做到这一点。
我有一个哈希,我有两个键,我想用一个键作为另一个键的值。在 Perl 中可以吗?
经验:
%hash= (
abs =>[a,b,c,e];
xyz=> abs
);
我试过但无法做到这一点。
您只是使用了错误的语法。试试这个:
#!/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);
您可以使用任何您希望的值作为散列值,包括另一个键的名称。但是,您不能不引用该值,因为它不会像键一样自动引用:
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) ]
您可能还会注意到,分号;
在分配给散列的内容中不是有效字符。括号内的键/值对应以逗号分隔,仅此而已。
首先,始终使用
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}
在这两种情况下,更改由changes引用的数组$hash{xyz}
,反之亦然。
注意:这仅在值是引用时才有效(因为它在这里),并且只有在您不更改$hash{abs}
或时才有效$hash{xyz}
。您仍然可以更改$hash{abs}
and引用的数组的元素$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
.