如果您维护 当前哈希 引用,这相对简单。这个小程序演示了
前几个步骤确保每个散列元素都存在并且它的值是一个散列引用。 $href 在每个阶段移动到下一个哈希级别。对于数组的最后一个元素,最新的哈希级别的元素是递增的,而不是设置为哈希引用。
这个数据结构是否是正确的选择取决于你在构建它之后还需要做什么
use strict;
use warnings;
my %hash;
my @array = qw/ first second third fourth fifth /;
drill_hash(\%hash, @array);
use Data::Dump;
dd \%hash;
sub drill_hash {
my ($href, @list) = @_;
my $final = pop @list;
$href = $href->{$_} //= {} for @list;
++$href->{$final};
}
输出
{
first => { second => { third => { fourth => { fifth => 1 } } } },
}
更新
了解您的目的后,保持此类 ngram 出现次数的最简单方法是拥有一个特定的哈希键,用于保持到目前为止单词序列的 count。
该程序使用值_COUNT 作为该键,例如,您可以看到{under}{a}{_COUNT} 和{under}{a}{rock}{_COUNT} 都是1
use strict;
use warnings;
my %counts;
count_ngram(\%counts, qw/ under a /);
count_ngram(\%counts, qw/ a rock /);
count_ngram(\%counts, qw/ under a rock /);
count_ngram(\%counts, qw/ a tree /);
count_ngram(\%counts, qw/ under a tree /);
use Data::Dump;
dd \%counts;
sub count_ngram {
my ($href, @ngram) = @_;
my $final = pop @ngram;
$href = $href->{$_} //= {} for @ngram;
++$href->{$final}{_COUNT};
}
输出
{
a => { rock => { _COUNT => 1 }, tree => { _COUNT => 1 } },
under => {
a => { _COUNT => 1, rock => { _COUNT => 1 }, tree => { _COUNT => 1 } },
},
}