这是我的代码..我正在尝试创建哈希查找表并在每个循环中访问它的数据..
#! usr/bin/perl
use warnings;
use strict;
sub bin2dec
{
return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}
while(<>)
{
if(/SIB_DBG/)
{
if(/TTRB:\s*([\da-f]+)\s([\da-f]+)\s([\da-f]+)\s([\da-f]+)/ ||
/ETRB:\s*([\da-f]+)\s([\da-f]+)\s([\da-f]+)\s([\da-f]+)/ ||
/Command\sETRB\s*([\da-f]+)\s([\da-f]+)\s([\da-f]+)\s([\da-f]+)/ )
{
print "$_ $1 $2 $3 $4\n";
my $deci1 = hex($1);
my $deci2 = hex($2);
my $deci3 = hex($3);
my $deci4 = hex($4);
my $bin = reverse sprintf("%032b",$deci4); #convert to 32 bit binary and reverse
print "\nbinary :$bin\n";
my $sub = substr($bin ,16,6); #extract required 6 bits
print "string :$sub\n";
my $type = bin2dec($sub);
my $val = $trb{"$type"};
print "TRB type: $type\n";
print "detail: $val\n";
}
}
}
my %trb = (
0 => "reserved",
32 => "transfer event",
48 => "vendor defined");
但即使我声明了trb,我也会收到错误。
全球符号&#34;%trb&#34;需要在script.plx第31行显式包名。 由于编译错误,script.plx的执行被中止。
我的输入日志文件再次类似于
Aug 31 15:25:53 usb3 kernel: [ 78.684054] SIB_DBG TTRB:00000000 00000000 00000000 00002401, PTR: ffff88005ff8b000
Aug 31 15:25:53 usb3 kernel: [ 78.815428] SIB_DBG ETRB: 5ff8b850 00000000 01000000 01018001
答案 0 :(得分:1)
您正在使用此行中的哈希值%trb:
my $val = $trb{"$type"};
在此处声明%trb之前:
my %trb = (
0 => "reserved",
32 => "transfer event",
48 => "vendor defined");
将%trb的声明移到while
循环之上。
答案 1 :(得分:1)
哈希%trb
必须在使用之前声明。将其定义移到while
语句之前 - 在子程序定义之后,一切都会很好
您似乎更熟悉不同的语言,因为您通常在程序结束时找到Perl子例程,但无论如何都无关紧要