无法通过perl

时间:2016-10-19 13:03:17

标签: perl

未获得下方输入行的预期输出。

基本上我正在做的是我在大括号内提取十六进制值和值。

  1. 花括号内的值应附加0x0(例如0x01)

  2. uint16的值应该被拆分为例如(0x27,0x89)

  3. 负值-116我想要8C   因为它的类型是sint8(例如-116 - Hex是FFFFFF8C - > 8C)

  4. 我正在使用map函数执行此操作,但我将输出视为一些意外值。

    我的代码:

    use strict;
    use warnings;
    
    my @data;
    while (<DATA>) 
    {               
        my (@matches) = /(?|(0x[\dA-F]+)|(?:\{\s*|\s)(-?\d+)(?!x))/g;
        #print "@matches\n";
        push @data, ($1);
    }
    
    {
        my $data = join ',', map "0x0$_", map { unpack '(A2)*' } @data;     
        print $data, "\n";    
    }
    
    __DATA__     
    meas_command    PHY_MEAS_CONFIG { 0}    meas_command        
    UE_position_meas_flag   else { 0}   UE_position_meas_flag       
    reporting_interval  MCFE_L1C_RPTPERIOD { 1} reporting_interval      
    fieldIndicator  tdd neighbor cell measurement indicator { 2}    fieldIndicator      
    Reserved1   0x00    Uint8,unsigned char     
    my_info    0x2789  Uint16, unsigned short        
    filler1{3} { 0x00, 0x00, 0x00 }    Uint8,unsigned char     
    rscp_tap   -116    Sint8,signed char              
    rch_type    PCH { 7}    Uint8,unsigned char 
    last_report 0   zeroth bit      
    no_sync 0   oneth bit
    

    预期产出:

     0x00,0x00,0x01,0x02,0x00,0x27,0x89,0x00,0x00,0x00,0x8c,0x07,0x00,0x00
    

    我得到的是:

    0x00,0x00,0x01,0x02,0x00x,0x000,0x00x,0x027,0x089,0x00x,0x000,0x0-1,0x016,0x07,0x00,0x00
    

    map函数出现问题。 请帮帮我?

3 个答案:

答案 0 :(得分:2)

这不是你的地图命令,它是你的正则表达式。

此代码中捕获的数据为:

$VAR1 = [
          '0',
          '0',
          '1',
          '2',
          '0x00',
          '0x2789',
          '0x00',
          '-116',
          '7',
          '0',
          '0'
        ];

如果你那么:

my @newdata =  map { [unpack '(A2)*'] } @data;
print Dumper \@newdata;

然后你得到的是:

$VAR1 = [
          [
            '0'
          ],
          [
            '0'
          ],
          [
            '1'
          ],
          [
            '2'
          ],
          [
            '0x',
            '00'
          ],
          [
            '0x',
            '27',
            '89'
          ],
          [
            '0x',
            '00'
          ],
          [
            '-1',
            '16'
          ],
          [
            '7'
          ],
          [
            '0'
          ],
          [
            '0'
          ]
        ];

希望能够深入了解错误是什么? unpack操作会在您执行此操作时返回一个列表,即使它没有 - 您正在使用前导0x和其他没有前导的值捕获某些值。

答案 1 :(得分:1)

以下是您对此同一问题的一些问题的历史记录

问题似乎主要在于您正在努力定义您的问题,其次是您不了解Perl

这里没有人可以帮助您定义您的问题,虽然只是为了继续尝试不同的方法是一种可怕的方法,但欢迎您在自己的时间对自己这样做

第二个问题是你不知道Perl,并且当你使用一些非常低级别的概念时,你不得不反复调用帮助甚至开始你的“扔意大利面直到它坚持”方法

你必须离开

  • 正确定义问题。 没有猜测。查看您可能获得的所有数据,并记下您的程序将处理的数据规范,最重要的是 - 坚持它不会处理任何其他除非您订婚修改你的代码

  • 了解您正在使用的Perl构造 。永远不要猜测他们可能会做什么,并将它们投入到您的计划中,以期获得幸运

    例如,使用unpack开始使用'0A0B0C'"\x01\x02\x03"之类的字符串,并找出如何打包和解压缩它们的方法。以几种不同的方式尝试每个格式说明符,直到您确信可以预测任何调用的结果

    我认为packunpack上的Perl文档很差(尤其是因为unpack是根据pack定义的,并且示例太少了)但答案是尝试,你认为文档说应该可以工作

无论你做什么,这样无休止的问题,你希望可以让你进入一个有效的程序,无论你是否理解它是如何工作的,都是良好编程习惯的诅咒

如果你通过猜测编写你的程序并在它工作时发布它,那么几个月之后会有人来找你说你写的这个东西有问题。他们会指着一条线,问道:“你为什么把它放在那里?它做了什么?它是如何工作的?”而且你会觉得这样的傻瓜说你不知道:你只是从网上复制了它

值得记住的是,雇主不喜欢“从互联网上复制”的软件,因为在开放软件领域之外,如果可以证明来源被抄袭,他们可能会被带上法庭

如果您想编写软件,请learn Perl properly。如果你想做别的事情那么请去做植物学家或太空人。但为了善良,请停止从互联网上复制代码并告诉别人您是程序员:您是从互联网复制的人,这不是真正的职业

16月-2016
read the data line by line from text file and then assign the value to the corresponding field in a structure

23九月2016
extracting hex values from line in perl

23九月2016
command line replacement with new value not working

26九月2016
separating array elements every 4 characters in array

27九月2016
Trouble extracting specific information from log file

27九月2016
matches happen but replacement not happening

29九月2016
unable to extratct the values through regex

30九月2016
How to do multiple value replacement in a multiple line at one time

18-OCT-2016
how to pass one regex output to another regex in perl

19-OCT-2016
Unable to extract expected value through map function in perl

答案 2 :(得分:0)

要获得所需的输出,您需要从每行中提取两条信息:

  1. 要转换的值。
  2. 应转换的类型(例如Uint16)。
  3. 例如,7如果类型为0x07则应为Sint8,如果类型为0x00,0x07则为Uint16,因此您需要两个值(7)和类型(Sint8Uint16)。

    目前,您甚至没有尝试提取类型,您说您在转换时遇到问题,但这不用说,因为您没有获得转换所需的所有信息!

    不幸的是,数据的格式不一致,不清楚和/或不完整。从该数据中提取必要的信息并非合理可行。 (例如,0meas_command PHY_MEAS_CONFIG { 0 } meas_command应该使用哪种类型?)在将数据修改为可解析之前,您的努力注定要失败。

    一旦您实现了这一目标,您已经看到了如何进行转化here