2

我在谷歌搜索,但我没有找到任何有用的东西。

尽管有很多 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"}}

但是正如我已经告诉过你的,散列的值可以是数组也可以是标量值,所以要访问上述散列,我需要先识别值的类型,然后再访问它!我怎样才能做到这一点?也就是说,如何识别键的值是标量、数组还是散列?

4

3 回答 3

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

检查哈希值是否为“数组”引用。如果是,则遍历数组并打印值。否则,立即打印散列值。

于 2013-01-19T13:51:19.193 回答
3

“尽管有很多 Perl 教程,但我没有找到任何教程会提到每个键都有不同值的散列?在 Perl 中可以做到这一点吗?”

您可能已经尝试查看Perl 发行版中包含的教程,其中包括Perl Data Structures Cookbook (perldsc)。它包括“更多详细记录”一章,其中提供了有关如何创建和使用值具有不同类型的哈希的示例。

“但正如我告诉过你的,散列的值可以是数组也可以是标量值,所以要访问上面的散列,我需要先识别值的类型,然后再访问它!我该怎么做呢? ?也就是说,我如何识别键的值是标量、数组还是散列?

由于您似乎对引用和运算符的使用不熟悉ref,您可能还想看看Mark 关于引用的非常简短的教程 (perlreftut)

请注意,所有这些教程(以及更多)已经随您的 Perl 发行版一起提供,您可以通过键入 eg 来访问它们

perldoc perlreftut

在命令行上。(在某些系统上,您可能需要安装一个额外的包来启用该perldoc命令。如果您打算进行任何 Perl 编程,强烈建议您这样做。)

于 2013-01-19T15:25:09.733 回答
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);

对于这个程序。!:)

于 2013-01-19T14:05:48.277 回答