ハッシュのハッシュを共有する 1 つの方法は、次のようにすべてのレベルのハッシュを宣言することです。
my %hash : shared;
$hash{test} = &share({});
しかし、第 1 レベルのキーの量を予測できない場合や、多すぎてすべてを宣言できない場合はどうでしょう。
以下のコードのように:
#!/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
......
スクリプトは、「SOME 行の共有スカラーの値が無効です」という警告によって停止します。%counts と %{$counts{KEY1}} の両方を共有する方法はありますか? テスト セットの列 1 で観察する果物の数と種類がわからない場合、出力は次のようになります。
apple pie 1
banana icecream 1
mango juice 1
mango pie 2
orange juice 1