【问题标题】:delete a key from a hash of array but I get Use of uninitialized value in hash element从数组的散列中删除一个键,但我在散列元素中使用未初始化的值
【发布时间】:2015-04-28 13:59:49
【问题描述】:

我想知道如何从数组哈希中删除一个键。 以以下文件为例,第四列始终是配对匹配中的第三列,数据未排序。

....
NS501570        WWW     3009824 3009848 
....
NS501572        WAD     3009848 3009898
....

我想把它折叠成

NS501570        WWW     3009824 3009848 NS501572        WAD     3009848 3009898

我写了以下代码。我选择第三列作为哈希键。因此我打印第一个条目中的值,第 4 列将是另一个条目的键:

use warnings;
use strict;

my $seq;
while(<>){
chomp;
my @line = split;
$seq->{"$line[2]" } = [@line];

}

foreach my $s (keys %{$seq} ) {
### @{ $seq->{$s}}[3] key for the second pair
        print @{ $seq->{$s}}[0],"\t",@{ $seq->{$s}}[1],"\t",@{ $seq->{$s}}[2],"\t",@{ $seq->{$s}}[3],"\t",@{ $seq->{@{ $seq->{$s}}[3]}}[0],"\t",@{ $seq->{@{ $seq->{$s}}[3]}}[1],"\t",@{ $seq->{@{ $seq->{$s}}[3]}}[2],"\t",@{ $seq->{@{ $seq->{$s}}[3]}}[3],"\n";

        delete ${$seq}{@{ $seq->{$s}}[3]};
        }

它有效,但有一个小问题! 我不知道如何删除第二个键(在本例中为第二个条目中的 3009848)而不会出现以下错误:

NS501570        WWW     3009824 3009848 NS501572        WAD     3009848 3009898
Use of uninitialized value in hash element at find_mate2.pl line 22, <> line 2.
Use of uninitialized value in hash element at find_mate2.pl line 22, <> line 2.
Use of uninitialized value in hash element at find_mate2.pl line 22, <> line 2.
Use of uninitialized value in hash element at find_mate2.pl line 22, <> line 2.
Use of uninitialized value in print at find_mate2.pl line 22, <> line 2.
Use of uninitialized value in print at find_mate2.pl line 22, <> line 2.
Use of uninitialized value in print at find_mate2.pl line 22, <> line 2.
Use of uninitialized value in print at find_mate2.pl line 22, <> line 2.
Use of uninitialized value in print at find_mate2.pl line 22, <> line 2.
Use of uninitialized value in print at find_mate2.pl line 22, <> line 2.
Use of uninitialized value in print at find_mate2.pl line 22, <> line 2.
Use of uninitialized value in print at find_mate2.pl line 22, <> line 2.

Use of uninitialized value in delete at find_mate2.pl line 23, <> line 2.

【问题讨论】:

  • delete ${$seq}{@{ $seq-&gt;{$s}}[3]}; 是一个非常奇怪的声明。你的意思是$key2 = $seq-&gt;{$s}[3]; delete $seq-&gt;{$key2}; 之类的吗?
  • 就此而言,@{ $seq-&gt;{$s}}[n] 最好写成$seq-&gt;{$s}[n]

标签: perl


【解决方案1】:

在 foreach 循环中迭代 3009848 键之前,您似乎正在删除 3009848。您可能可以尝试一个简单的next unless defined $seq-&gt;{$s};,因为您已经在 3009824 的交互中删除了 $s==3009848。defined 检查永远不会受到伤害...

【讨论】:

    【解决方案2】:

    警告是由于您在迭代哈希元素时删除了它们,这通常是个坏主意。

    Perl 警告您正在尝试打印不再存在的内容。另外,请注意,除非您对它们进行排序,否则键会以随机顺序返回。

    看看:

    How should I delete hash elements while iterating?

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 2023-03-24
      • 2011-02-03
      • 2015-04-16
      • 2011-01-15
      • 2014-01-16
      • 1970-01-01
      • 2015-07-01
      • 2013-12-30
      相关资源
      最近更新 更多