未获得下方输入行的预期输出。
基本上我正在做的是我在大括号内提取十六进制值和值。
花括号内的值应附加0x0(例如0x01)
uint16的值应该被拆分为例如(0x27,0x89)
负值-116我想要8C 因为它的类型是sint8(例如-116 - Hex是FFFFFF8C - > 8C)
我正在使用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
函数出现问题。
请帮帮我?
答案 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"
之类的字符串,并找出如何打包和解压缩它们的方法。以几种不同的方式尝试每个格式说明符,直到您确信可以预测任何调用的结果
我认为pack
和unpack
上的Perl文档很差(尤其是因为unpack
是根据pack
定义的,并且示例太少了)但答案是尝试,你认为文档说应该可以工作
无论你做什么,这样无休止的问题,你希望可以让你进入一个有效的程序,无论你是否理解它是如何工作的,都是良好编程习惯的诅咒
如果你通过猜测编写你的程序并在它工作时发布它,那么几个月之后会有人来找你说你写的这个东西有问题。他们会指着一条线,问道:“你为什么把它放在那里?它做了什么?它是如何工作的?”而且你会觉得这样的傻瓜说你不知道:你只是从网上复制了它
值得记住的是,雇主不喜欢“从互联网上复制”的软件,因为在开放软件领域之外,如果可以证明来源被抄袭,他们可能会被带上法庭
如果您想编写软件,请learn Perl properly。如果你想做别的事情那么请去做植物学家或太空人。但为了善良,请停止从互联网上复制代码并告诉别人您是程序员:您是从互联网复制的人,这不是真正的职业
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)
要获得所需的输出,您需要从每行中提取两条信息:
Uint16
)。例如,7
如果类型为0x07
则应为Sint8
,如果类型为0x00,0x07
则为Uint16
,因此您需要两个值(7
)和类型(Sint8
或Uint16
)。
目前,您甚至没有尝试提取类型,您说您在转换时遇到问题,但这不用说,因为您没有获得转换所需的所有信息!
不幸的是,数据的格式不一致,不清楚和/或不完整。从该数据中提取必要的信息并非合理可行。 (例如,0
中meas_command PHY_MEAS_CONFIG { 0 } meas_command
应该使用哪种类型?)在将数据修改为可解析之前,您的努力注定要失败。
一旦您实现了这一目标,您已经看到了如何进行转化here。