gpt4 book ai didi

珀尔;如何按值过滤哈希(指定条件)

转载 作者:行者123 更新时间:2023-12-02 08:27:09 25 4
gpt4 key购买 nike

我不是 perl 语言专家,但我遇到了一个我无法解决的问题,即使在网络上进行了长时间的研究之后。简而言之,我有一个这样的哈希值:

my %HoH = (
chr1 => { start => 30, end => 55, },
chr1 => { start => 18, end => 21, },
chr1 => { start => 30, end => 80, }
);

我只是想找到一种方法来过滤特定值(我的意思是,在输出中获得新的哈希值)。特别是,给定一个区间,比如说 40-60,我想要一个新的哈希值,其中只有元素与这个区间重叠。

换句话说,我想得到输出:

my %HoH = (
chr1 => { start => 30, end => 55, },
chr1 => { start => 30, end => 80, }
);

作为第一次尝试,我想尝试这样的事情:

识别并删除所有带有 "end" < 40 的元素和:识别并删除所有带有 "start" > 60 的元素.

所以我只是尝试了:

grep { $HoH{$_}{"end"} < 40 } keys(%HoH); 
delete $HoH{$_} for grep { $HoH{$_}{"end"} < 40} keys(%HoH);

但就在我在输出中发现的两个过滤器中的第一个之后,只有最后一个元素,我真的不明白错误在哪里:

hash size is 1
chr1: start=30 end=80

打印出以下内容:

my $len = keys %HoH;
print "hash size is $len\n";

foreach my $chr ( keys %HoH ) {
print "$chr: ";
for my $position ( keys %{ $HoH{$chr} } ) {
print "$position=$HoH{$chr}{$position} ";
}
print "\n";
}

这次对我来说似乎很复杂,如果你们中的任何人能给我一些帮助,我会很高兴。

最佳答案

正如另一张海报提到的 - 你的问题不是你的哈希合并,而是哈希不能有重复的键:

use strict;
use warnings;
use Data::Dumper;

my %HoH = (
chr1 => { start => 30, end => 55, },
chr2 => { start => 18, end => 21, },
chr3 => { start => 30, end => 80, }
);


grep { $HoH{$_}{"end"} < 40 } keys(%HoH);
delete $HoH{$_} for grep { $HoH{$_}{"end"} < 40} keys(%HoH);

print Dumper \%HoH;

这可以正常工作 - 请注意不同的哈希键。不过我会注意到 - 你正在迭代你的 key ,grepping它们,然后删除它们。这样做可能会更好:

foreach my $element ( keys %HoH ) {
delete $HoH{$element}
unless ( $HoH{$element}{start} < 40
or $HoH{$element}{end} > 60 );
}

print Dumper \%HoH;

你可以通过一个哈希数组来做你想做的事情:

use strict;
use warnings;
use Data::Dumper;

my @AoH = (
{ start => 30, end => 55, },
{ start => 18, end => 21, },
{ start => 30, end => 80, }
);

print Dumper \@AoH;

my @filtered = grep { $_->{start} > 40 or $_->{end} < 60 } @AoH;
print Dumper \@filtered;

注意 - 在您的原始示例中,您的 grep/delete 行正在做同样的事情,您可以执行复合 grep 来测试这两种情况。

关于珀尔;如何按值过滤哈希(指定条件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31048217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com