将输入拆分为存储桶 - Perl

时间:2014-10-22 00:48:23

标签: perl

我知道如何以漫长的方式做到这一点,但我想知道是否有一种简单的方法可以将一系列数字拆分成桶。

我有一系列将两个数字联系在一起的数据:

频率值

我想将这些值分解为频率的子部分,然后得到每个跨度成员的平均值和标准偏差,即0.05的频率结果。

所以我想要的是一系列数组,其中包含与频率相关的值。

我啰嗦的方法是

%results = ();
$key = int( ( $frequency * 100 ) / 20 );
if ( !exists( $results{$key} ) ) {
    @temp = ($value);
    $results{$key} = @temp;
} else {
    $results{$key} = push( $results{$key}, $value );
}

有没有办法简化这个?

2 个答案:

答案 0 :(得分:3)

看起来你真的想要一个Hash of Arrays。

因此您需要push

push @{ $results{$key} }, $value;

有关此类概念的更多信息,请查看Perl Data Structures Cookbook

答案 1 :(得分:1)

您只需要在尝试从哈希表中获取数据时检查是否存在。在向表中添加数据时,您不需要这样做。 此外,您不需要在数组上放置临时名称。您可以通过在数字列表周围放置[]来创建匿名数组。您也可以使用{}进行匿名哈希,但这并不直接与此问题相关。

my %results;    #will store data like $results{$frequency} = [list of values]
# storing data:
my $key = int( ( $frequency * 100 ) / 20 );
push @{$results{$frequency}}, $value;           #the @{ } means interpret $results{$frequency} as an array
# fetching data, here is where you check if things exist, sometimes
foreach (keys %results) {
    print "For $_ frequency...\n";
    print "The values are: @{$results{$_}}\n\n";    #if you don't include @{ }, it will say ARRAYREF(0xsdfasdf)
}