【问题标题】:Error in accessing Hash key访问哈希键时出错
【发布时间】:2015-09-02 22:29:22
【问题描述】:

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

 #! 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 也会出现错误。

全局符号“%trb”需要在 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

【问题讨论】:

    标签: perl


    【解决方案1】:

    您在这一行中使用了哈希 %trb:

            my $val = $trb{"$type"};              
    

    在您在这里声明 %trb 之前:

    my %trb = (
    0 => "reserved",
    32 => "transfer event",
    48 => "vendor defined");
    

    将 %trb 的声明移到 while 循环上方。

    【讨论】:

      【解决方案2】:

      哈希%trb 必须在使用前声明。将其定义移至 while 语句之前 - 在您的子例程定义之后,一切都会好起来的

      您似乎更熟悉另一种语言,因为您通常会在程序末尾找到 Perl 子例程,但这两种方式都没有关系

      【讨论】:

        猜你喜欢
        • 2016-01-20
        • 2017-10-04
        • 1970-01-01
        • 2013-03-22
        • 2014-05-06
        • 2014-09-03
        • 1970-01-01
        • 1970-01-01
        • 2011-12-29
        相关资源
        最近更新 更多