我在Google搜索过,但我没有找到任何有用的内容。
即使Perl有很多教程,我也没有找到任何教程可以提到每个键都有不同值的哈希值? 在Perl中这样的事情可能吗?
例如,可以有一个哈希,其中包含2个键(a
,b
),其中:
$myhash{"a"}=1;
$myhash{"b"}=[ 'hamnet', 'shakespeare', 'robyn', ];
上述情况可能吗?
我试过了:
#!/usr/bin/perl
use strict;
my %x;
$x{"a"}="b";
$x{"b"}=['c','d'];
foreach (keys %x)
{
print $_."\n";
print "$x{$_}";
}
但它正在输出:
a
bb
ARRAY(0x1ece50)
我对如何访问此哈希的元素感到困惑。
我想告诉你所有这些,尽管我知道Perl,但我是一个关于哈希的完整新手。
好的,我发现了一件事 - 要访问哈希中的数组,我需要这样做:
@{$x{"b"}}
但是正如我告诉你的那样,哈希的值可以是数组或标量值,所以为了访问上面的哈希,我需要首先识别值的类型然后访问它!我怎样才能做到这一点? 也就是说,如何识别键的值是标量,数组还是散列?
答案 0 :(得分:3)
我认为这就是你想要的:
#!/usr/bin/perl -w
use strict;
my %x;
$x{"a"}="b";
$x{"b"}=['c','d'];
foreach my $a (keys %x)
{
if ( ref $x{$a} eq 'ARRAY' )
{
foreach my $b ( @{ $x{$a} } )
{
print $b."\n";
}
}
else
{
print $x{$a}."\n";
}
}
<强>输出:强>
# perl test.pl
b
c
d
检查哈希值是否为'ARRAY'引用。如果是,则迭代数组并打印值。否则,马上打印哈希值。
答案 1 :(得分:3)
“即使Perl有很多教程,我也没有找到任何教程可以提到每个键都有不同值的哈希值?在Perl中这样的事情是可能的吗?”
您可能已尝试查看tutorials included in your Perl distribution,其中包含Perl Data Structures Cookbook (perldsc)。它包含一个关于"More Elaborate Records"的章节,其中给出了如何创建和使用其值具有不同类型的哈希的示例。
“但正如我已经告诉过你的那样,散列的值可以是数组也可以是标量值,所以为了访问上面的散列,我需要先识别值的类型然后访问它!怎么能我这样做了?也就是说,如何识别键的值是标量,数组还是哈希?“
由于您似乎不熟悉使用references和ref
运算符,因此您可能还需要查看Mark's very short tutorial about references (perlreftut)。
请注意,所有这些教程(以及更多)都已经附带了Perl发行版,您可以通过键入eg来访问它们。
perldoc perlreftut
命令行上的。
(在某些系统上,您可能需要安装一个额外的软件包来启用perldoc
命令。如果您打算进行任何Perl编程,强烈建议这样做。)
答案 2 :(得分:1)
所以为了访问上面的哈希,我需要首先识别值的类型,然后访问它!。我怎么能这样做?即,我如何识别键的值是单数,数组,哈希?
我认为一个干净的解决方案是编写一个简单的to_string
函数(不支持更深层次的嵌套结构),它标识一个值是标量,数组引用还是哈希引用(这是什么[...]
创建:对匿名数组的引用,请参阅perlreftut)。详细了解ref。
sub to_string {
my $thing = shift;
for (ref $thing) {
# join with comma if $thing is an array ref
return join ', ' => @$thing when 'ARRAY';
# join key-value list with comma if $thing is a hash ref
return join ', ' => map {"$_ => $thing->{$_}"} keys %$thing when 'HASH';
# else: simply return the $thing itself
return $thing;
}
}
在一个简单的示例程序中
my %data = (
foo => 42,
bar => [1, 2, 3],
baz => {a => 'yay', b => 'nay'},
);
for my $key (keys %data) {
say "$key: " . to_string($data{$key});
}
它会给你这个输出:
bar: 1, 2, 3
baz: a => yay, b => nay
foo: 42
请注意,您必须
use feature qw(say switch);
这个程序。 HTH! :)