共享散列散列的一种方法是声明每一级散列,例如:
my %hash : shared;
$hash{test} = &share({});
但是如果第一级密钥的数量无法预测或太多以至于您无法声明每个密钥怎么办。
像下面的代码:
#!/usr/bin/perl -w
use strict;
use threads;
use threads::shared;
my %counts :shared;
my $infile = $ARGV[0];
open my $inf, "$infile";
while(my $inline = <$inf>){
chomp($inline);
my @entry = split(/\t/,$inline);
my $t = threads->create('WORK',@entry)->join;
}
foreach my $i(sort {$a cmp $b} keys %counts){
foreach my $j(sort {$a cmp $b} keys %{$counts{$i}}){
print "$i\t$j\t$counts{$i}{$j}\n";
}
}
sub WORK{
my @work = @_;
$counts{$work[0]}{$work[1]}++;
}
和测试集:
apple pie
banana icecream
orange juice
mango juice
mango pie
mango pie
......
该脚本将通过警告您“某些行的共享标量的无效值”来停止。那么有没有一种方法可以共享 %counts 和 %{$counts{KEY1}}?假设我不知道我将在测试集第一列观察到多少种水果,输出应该是这样的:
apple pie 1
banana icecream 1
mango juice 1
mango pie 2
orange juice 1