gpt4 book ai didi

regex - 在 perl 脚本中处理文件时如何在某些情况下需要 grep

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:47:08 28 4
gpt4 key购买 nike

我想为以下各种警告捕获并制作一行

这是我用来收集不同警告的代码片段,在观察警告模式后,我有不同行的警告,我想在一行中加入下一行警告部分并为其分配一个哈希引用。

#!/usr/bin/perl

use strict;
use warnings;

open(FH,"/home/goudar/Desktop/1.log") or die !$;

while(<FH>){
my $line = $_;
if($line =~ m/^Warning: (.*)$/){
my $date1 = `date`;
chomp($date1);
$subStepValues = {
Warning => $1,
Warning_timeStamp => $date1,
};
push @{$subsSteps->{'subStepValues'}}, $subStepValues;
}
}
close(FH);

文件

Warning: No clock-gating check is inferred for clock clk_12800 
at pins i_osc/i_osc_top/i_clk_div/g817/S and i_osc/i_osc_top/i_clk_div/g817/A1 of cell i_osc/i_osc_top/i_clk_div/g817. (PTE-060)
Warning: Virtual clock 'clk_vir' cannot be made propagated. (UITE-316)
Warning: Virtual clock 'clk_ext' cannot be made propagated. (UITE-316)
Warning: Net i_obr/i_obr34/rec2 has been annotated with max resistance
using the set_resistance command. This takes precedence over
values from parasitics. (PARA-047)
Warning: Net i_obr/i_obr34/rec2 has been annotated with min resistance
using the set_resistance command. This takes precedence over
values from parasitics. (PARA-047)

最佳答案

您需要对代码进行非常小的添加。

除了匹配/^Warning:/之外唯一的可能是它在下一行的延续,这正是您想要的。所以你可以添加一个 else分支并在其中将该行附加到先前匹配的最后一个“警告”。这也处理多个这样的行,它们都被附加到最后一个“Warning”,一个接一个。所以你需要:

1) 记住最后一次匹配在数组中的位置('Warning')

2) 添加 else您在其中使用计数器的最后一个值将行附加到最后一个“Warning”。
为此,您现在必须 chomp线。

use strict;
use warnings;

open(FH,"/home/goudar/Desktop/1.log") or die !$;

my $subStepValues; # added missing declarations
my $subsSteps = { };

my $cnt = -1; # added
while (<FH>) {
chomp(my $line = $_); # added
if ($line =~ m/^Warning: (.*)$/) {
$cnt++; # added
my $date1 = `date`;
chomp($date1);
$subStepValues = {
Warning => $1,
Warning_timeStamp => $date1,
};
push @{ $subsSteps->{'subStepValues'} }, $subStepValues;
}
else { # added
$subsSteps->{'subStepValues'}->[$cnt]->{'Warning'} .= " $line";
}
}
close(FH);

foreach my $ss (@{$subsSteps->{'subStepValues'}}) { # added, print
foreach my $key (keys %{$ss}) {
print "$key => $ss->{$key}\n";
}
}

这将打印属于每个“警告”的所有行。

我推荐三参数打开,open my $fh, '<', $infile , 然后 while ($fh) { } .


或者,您可以将整个文件读入一个字符串(或将其读入一个数组并连接)并删除新行。然后在 Warning: 上拆分该字符串(删除第一个元素,一个空字符串),或者以与您相同的方式匹配,但在全局范围内匹配( /g 修饰符)。

这形成了一个数组,其中每个元素都是一个字符串,所有文本都属于它的 /^Warning:/。 .然后再次传递该数组,添加该时间戳并将其全部放入您的数据结构中。

关于regex - 在 perl 脚本中处理文件时如何在某些情况下需要 grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35861054/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com