散列中每个键的不同类型的值

时间:2013-01-19 13:01:18

标签: perl hash

我在Google搜索过,但我没有找到任何有用的内容。

即使Perl有很多教程,我也没有找到任何教程可以提到每个键都有不同值的哈希值? 在Perl中这样的事情可能吗?

例如,可以有一个哈希,其中包含2个键(ab),其中:

$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"}}

但是正如我告诉你的那样,哈希的值可以是数组或标量值,所以为了访问上面的哈希,我需要首先识别值的类型然后访问它!我怎样才能做到这一点? 也就是说,如何识别键的值是标量,数组还是散列?

3 个答案:

答案 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"的章节,其中给出了如何创建和使用其值具有不同类型的哈希的示例。

  

“但正如我已经告诉过你的那样,散列的值可以是数组也可以是标量值,所以为了访问上面的散列,我需要先识别值的类型然后访问它!怎么能我这样做了?也就是说,如何识别键的值是标量,数组还是哈希?“

由于您似乎不熟悉使用referencesref运算符,因此您可能还需要查看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! :)

相关问题