我是Perl的初学者,但必须开发一些脚本来解析TCP转储。 这是(我将其截断并仅保留相关代码):
我收到以下错误: 线程1异常终止:TestThread1.pl第16行的共享标量值无效, 这是因为这个字符串: %input =(%input,$ fix_ClOrdID => [$ FrameTime_epoch,$ fix_MsgType]);
从许多类似的主题我读过,我明白我不能使用threads :: shared共享嵌套引用。我还找到了一些解决方法,如何做到这一点。但由于缺乏经验,我不能为我的案例应用例子。
请问您如何修复我的脚本以使其正常工作!
use threads;
use threads::shared;
my %input:shared = ();
threads->new(\&FixParser)->detach();
sub FixParser{
open(InFile, 'myFix.dmp') || die;
while(InFile>){
($FrameTime_epoch,$fix_MsgType,$fix_ClOrdID) = split(';',);
if(exists($input{$fix_ClOrdID})){
$ExecDelay=$FrameTime_epoch-$input{$fix_ClOrdID}[0];
print "MsgType: $input{$fix_ClOrdID}[1] ExecDelay: $ExecDelay us\n";
delete($input{$fix_ClOrdID});
}
else{
%input = (%input, $fix_ClOrdID => [$FrameTime_epoch,$fix_MsgType]);
}
}
}
答案 0 :(得分:1)
在添加哈希值之前锁定共享变量和克隆结构
sub FixParser {
open(my $InFile, "<", 'myFix.dmp') || die $!;
while(<$InFile>) {
ADVISORY_LOCK: {
lock(%input);
# ..
if(exists($input{$fix_ClOrdID})) {
# ..
}
else{
# %input = (%input, $fix_ClOrdID => [$FrameTime_epoch,$fix_MsgType]);
$input{ $fix_ClOrdID } = threads::shared::shared_clone( [$FrameTime_epoch,$fix_MsgType] );
}
}
}
}