如何在Perl中访问自定义哈希结构?

时间:2014-07-14 05:48:17

标签: perl

我有一个自定义的perl哈希数据结构。结构如下:

%myhash = (
            1 => {
                'scf1' => [
                    1,3,0,4,6,7,8,

                ],
                'sef2' => [
                    10,15,20,30,
                ]
            },
            2 => {
                'scf1' => [
                    10,3,0,41,6,47,81,
                ],
                'scf3' => [
                   1,66,0,123,4,1,2435,33445,1
                ]
            },
 );

我如何访问这种perl结构。

3 个答案:

答案 0 :(得分:2)

我担心你的代码......显示出你误解了哈希的作用以及它们如何运作的迹象。具体来说,当您引用@{$myhash}时,这与您%myhash的{​​{1}}不同。

同样 - undef发生了什么?看起来你正在尝试构建一个数组数组,但是通过迭代@features然后推送来实现这一点。多维数组有时候是工作的正确工具,但不清楚为什么它适合你正在做的事情。 (毕竟,你不要在这段代码中用它做任何其他事情)。

你还有fetchrow_array - 这也没有做你想象的那样 - 它没有引用$line[2],它是名为$line的列表的第二个元素 - 不存在。

您还尝试处理数据库条目列表,如果它是undef则将其设置为“-1”。

我们需要更详细地了解您从数据库中获取的数据 - @line可以是任何数据。但是,我强烈建议你要做的就是在你去的时候给每个字段命名。我建议你不要在那里使用$sth -> fetchrow_array(),因为它是......好吧,错了。您正在迭代刚刚获取的行中的列。

获取数组中的哪个字段是哈希的键?看起来你正试图键入“字段5”字段7'并尝试插入“字段1”和“字段2”的值。那是对的吗?

哦,当你在它的时候打开$line

答案 1 :(得分:0)

获取内部数组:

my @array = @{$hash{1}->{'scf1'}};
# is same as
# my $array_ref = $hash{1}->{'scf1'};
# my @array = @{$array_ref};
# then you can
my $some_thing = $array[0];

或获取一个元素:

$hash{1}->{'scf1'}->[0];

答案 2 :(得分:0)

Data::Dumper转储中,我看到您有一个名为%myhash的哈希。该哈希中的每个元素都包含对另一个哈希的引用。并且,该内部哈希中的每个元素都包含对数组的引用。

让我们带你的Data :: Dumper,然后像这样重写:

$myhash{1}->{sff1} = [1, 3, 0, 4, 6, 7, 8];
$myhash{1}->{sef2} = [10, 15, 20, 30];
$myhash{2}->{scf1} = [10, 3, 0, 41, 6, 47, 81];
$myhash{2}->{scf3} = [1, 66, 0, 123, 4, 2435, 33445, 1];

同样的事情。它只是更紧凑。

要打印出来,我们需要遍历每个参考层:

#
# First loop: The outer hash which is a plain normal hash
#
for my $outer_key ( sort keys %myhash ) {
    #
    #  Each element in that hash points to another hash reference. Dereference
    #
    my %inner_hash = %{ $myhash{$outer_key} };
    for my $inner_key ( sort keys %inner_hash ) {
        #
        # Finally, this is our array reference in the inner hash. Let's dereference and print
        #
        print "\$myhash{$outer_key}->{$inner_key}: ";
        my @array = @{ $myhash{$outer_key}->{$inner_key} };
        for my $value ( @array ) {
            print "$value";
        }
        print "\n";
    }
}