0
一種方法是申報像哈希的各個層面:如何共享哈希散列在多線程的perl分享哈希散列
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
......
腳本將被警告您停止「在某些線路共享標值無效」。那麼有沒有辦法可以分享%計數和%{$計數{KEY1}}?假設我不知道有多少,並觀察測試組列一個什麼種水果和輸出應該是這樣的:
apple pie 1
banana icecream 1
mango juice 1
mango pie 2
orange juice 1
謝謝!我知道它可以簡化,我創建這個例子只是爲了學習如何在perl中使用多線程。但在第二種解決方案中,你的意思是// =還是|| =? – lolibility
@lolibility我用過'// ='。這意味着「如果未定義,則分配」。 '$ a // = $ b'與'$ a = defined $ a?'相同。 $ a:$ b'。這在古代波爾文中是不可用的。但是,'|| ='也可以。 – amon