在Perl

时间:2015-09-02 09:12:20

标签: perl

我想将$ 1,$ 2,$ 3和$ 4中的十六进制值转换为二进制并保存在数组中。我知道$ 1只是一个字符串,所以我尝试在转换为二进制之前将其转换为十六进制,但它不起作用......这是我的代码:

#! usr/bin/perl
use warnings;
use strict;

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]+)/ )
        {
            my $one = $1;
            my $two = $2;
            my $three = $3;
            my $four = $4;
            print "$_ $one $two $three $four\n";
            printf("binary :%b\n",$four);
        }
    }
}

我的输入日志文件就像

Aug 31 15:25:53 usb3 kernel: [   78.812034] SIB_DBG TTRB:01000680 00080000 00000008 00030840, PTR: ffff88005ff8b800
Aug 31 15:25:53 usb3 kernel: [   78.815428] SIB_DBG ETRB: 5ff8b850 00000000 01000000 01018001

此外,我在某些内容中收到错误说明..

  

参数“f8891”在script.plx第21行的printf中不是数字,&lt;&gt;第6行。

1 个答案:

答案 0 :(得分:2)

问题是文本字符串和数值之间存在差异。

后者可以表示为十六进制,二进制,八进制 - 在幕后,计算机无论如何都在想二进制。

虽然文本字符串是一系列字符代码,表示来自字符集的符号。

所以要做你想做的事 - 你需要转换你的&#39;字符串&#39;首先是数值。

Perl具有hex功能为您执行此操作:

#!/usr/bin/env perl
use strict;
use warnings;

my $string = '5ff8b850'; 
my $value =  hex ( $string );

print "Dec: ",$value,"\n";
printf ( "Hex: %X\n", $value );
printf ( "Binary: %b\n", $value );