【问题标题】:Accessing array of hashes in Perl在 Perl 中访问哈希数组
【发布时间】:2016-12-12 08:42:58
【问题描述】:
  1. 创建后访问数组的每个元素中的哈希时遇到问题,但它给出了最后一个元素。我应该怎么做才能访问我的数组的所有元素?
  2. 当我想将哈希推送到数组时,我使用{} 而不是(),因为如果我不这样做,它会给我错误。当我使用 {} 时,它的外观如何?
    @stem = ();
    for ($i = 0; $i < 2; ++$i) {
        push @stem, { u1 => 1, u2 => 2 , u3 => 3 };
    }

    @ants = ();
    $count = 0;
    for ($i = 0; $i < scalar(@stem); ++$i) {
        @allowed = ();
        %hash = ();
        for ($j = 0; $j < scalar(@stem); ++$j) {
            push @allowed, { stem => ++$count, hinfo => ++$count };
        }
        %hash = (allowed => \@allowed, solution => ++$count);
        push (@ants, \%hash);
    }

    for ($i = 0; $i < scalar(@ants); ++$i) {

        %test = %{$ants[$i]};
        print "=>", $test{solution}, "\n";
        @temp = @{$test{allowed}};

        for ($j = 0; $j < scalar(@temp); ++$j) {
            print $j, ":", $temp[$j]->{stem}, " ", $temp[$j]->{hinfo}, "\n";
        }
    }

输出:

=>21
0:16 16
1:18 18
2:20 20
=>21
0:16 16
1:18 18
2:20 20

【问题讨论】:

  • 请您出示您的代码的 MCVE (minimal reproducible example)。特别是,我们需要与您所拥有的 @stems 数组等价的东西。它不需要包含超过几个条目,并且可能不需要读取数据(手工制作数据结构)。
  • 感谢更新,但不清楚我们从代码中知道$length@seq1@seq2@matrix 是什么。 MCVE 允许我们运行您的代码。我们不应该花时间弄清楚你有什么。
  • 为什么不把额外的信息写成:my @seq1 = ('a','a','b'); my @seq2 = ('b','a','b'); my @matrix = ( [0,1,1], [1,1,0], [0,0,1], ); my $length = 2;?您是否使用use strict; use warnings; 运行?没有它们我不会运行 Perl 代码。我只使用了 20 多年,而且我对它的了解还不够,不能冒险不使用它们。当我运行您的代码时,我被告知if($matrix[$i+$w][$j+$w] eq "."){++$count;} 行正在越界访问数组。此外,如果数组包含 0 和 1 值,那么元素何时会等于 "."
  • sorry...我重写代码你可以运行它...我不用use strict; use warnings 有必要用吗??? ...对于矩阵,它包含空格和点,但我没注意抱歉
  • 养成同时使用它们的习惯——总是。目前在这里可能无关紧要,但安全总比抱歉好。没有它们,我不会在 SO 上发布 Perl 代码——没有它们,我太冒险了。

标签: arrays perl hash


【解决方案1】:

2) 当我想将哈希推送到数组时,我使用{} 而不是(),因为如果我不这样做,它会给我错误。当我使用{} 时,它如何看待?

我可以回答这个问题 2。

当您使用() 时,perl 将其视为元素列表。当您使用{} 时,perl 将其视为对哈希的引用。

所以当你这样做时:push @Arr, (x=&gt;2, y=&gt;5); 四个元素将被推送到@Arrx2y5。这不是你的意图。

但是当您这样做时:push @Arr , {x =&gt; 2, y =&gt; 5}; 对包含 xy 作为键的匿名哈希的单个引用,以及 25 作为各自的值将被推送到 @Arr .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2013-03-08
    • 2013-11-01
    • 2011-12-29
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多