输入日志文件:
Nservdrx_cycle 4 servdrx4_cycle
HCS_cellinfo_st[10] (type = (LTE { 2}),cell_param_id = (28)
freq_info = (10560),band_ind = (rsrp_rsrq{ -1}),Qoffset1 = (0)
Pcompensation = (0),Qrxlevmin = (-20),cell_id = (7),
agcreserved{3} = ({ 0, 0, 0 }))
channelisation_code1 16/5 { 4} channelisation_code1
sync_ul_info_st_ (availiable_sync_ul_code = (15),uppch_desired_power =
(20),power_ramping_step = (3),max_sync_ul_trans = (8),uppch_position_info =
(0))
trch_type PCH { 7} trch_type8
last_report 0 zeroth bit
我试图仅为我上面的输入提取整数,但我面对一些 如果字符串在开头和结尾包含整数,则会出现问题
For(例如agcreserved {3},HCS_cellinfo_st [10],Qoffset1) 在这里,我不想忽略{3},[10]和1,但在我的代码中它确实如此。 因为我只提取整数。
这里我写了一个简单的正则表达式来提取整数。
我的简单代码:
use strict;
use warnings;
my $Ipfile = 'data.txt';
open my $FILE, "<", $Ipfile or die "Couldn't open input file: $!";
my @array;
while(<$FILE>)
{
while ($_ =~ m/( [+-]?\d+ )/xg)
{
push @array, ($1);
}
}
print "@array \n";
输出上面输入的内容:
4 4 10 2 28 10560 -1 1 0 0 -20 7 3 0 0 0 1 16 5 4 1 15 20 3 8 0 7 8 0
预期产出:
4 2 28 10560 -1 0 0 -20 7 0 0 0 4 15 20 3 8 0 7 0
如果有人可以帮我解释一下?
答案 0 :(得分:2)
您正在捕获每个整数,因为正则表达式对整数之前/之后可以(或不能)出现的字符没有限制。请记住,/x
modifier仅用于允许模式中的空格/注释以便于阅读。
在不了解输出数据的可能结构的情况下,此修改可实现所需的输出:
while ( $_ =~ m! [^[{/\w] ( [+-]?\d+ ) [^/\w]!xg ) {
push @array, ($1);
}
我在整数之前和之后添加了规则以排除某些字符。所以现在,我们只会捕获:
[
,{
,/
或字字符/
或字字符
如果您的数据在{ N}
块中可能包含2位数字(例如PCH {12}
),那么这将无法捕获这些数字,并且模式将需要变得更加复杂。因此,该解决方案非常脆弱,不了解有关目标数据的更多规则。