访问哈希密钥时出错

时间:2015-09-02 14:09:47

标签: perl

这是我的代码..我正在尝试创建哈希查找表并在每个循环中访问它的数据..

 #! 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

2 个答案:

答案 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子例程,但无论如何都无关紧要