在第n个模式匹配后获取一个字符-PERL
我有一个结构如下的示例文件,我想对其执行一些操作:在第n个模式匹配后获取一个字符-PERL,perl,matching,Perl,Matching,我有一个结构如下的示例文件,我想对其执行一些操作: 1112283569;AOEEEEAOAO.;300012299419;0030000302;ALLE;0.00;0.00;0.00;0.00;79149449.66;0.00;7914944 1112283569;AOEEEEAOAO.;300012;;;;AAAAA299419;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66 1112283569;AOEEEEAOAO.;*;*;;0.
1112283569;AOEEEEAOAO.;300012299419;0030000302;ALLE;0.00;0.00;0.00;0.00;79149449.66;0.00;7914944
1112283569;AOEEEEAOAO.;300012;;;;AAAAA299419;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66
1112283569;AOEEEEAOAO.;*;*;;0.00;0.;;;;;;;;;00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149
*;CON;*;0030000302;ΑLLEO;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149449.66;0.00
;CONE:;*;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;;;79149449.66;0.00
我正试图想出一个解决办法。我需要读一个类似上面的文件,
以“;”分隔我需要一次检查每行第三个分隔符后面的字符。它不会在一段时间内发生
静态列,所以我需要一些方法来捕获第n个分隔符(;)之后的字符,我想我可以用正则表达式来实现这一点
即,对于上述输出:
第1行-不符合条件
第2行-不符合条件
第3行-符合条件
第4行-不符合条件
第5行-符合条件
最后,它将输出如下内容:
1112283569;AOEEEEAOAO.;*;*;;0.00;0.;;;;;;;;;00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149
;CONE:;*;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;;;79149449.66;0.00
(仅限第三个分隔符后的第一个字符为*的行)
我发现了这种类型的正则表达式,但我不确定它是否适用于这种情况:
/\%(^\%([^ ]* \)\{6\}\)\@<=.
/\%(^\%([^]*\)\{6\}\@您只需在上进行拆分即可代码>,然后检查必填字段的第一个字符
use strict;
use warnings;
my $char = '*';
my $nth = 3;
my $file = 'data_delim.txt';
open my $fh, '<', $file or die "Cannot open $file -- $!";
while (my $line = <$fh>)
{
my @fields = split ';', $line, $nth+1;
if ($fields[$nth] =~ m/^\Q$char/) {
print $line;
}
}
我怀疑这个问题可能涉及更多内容,并保留前面的所有条款
对于显示输入的输入文件data_delim.txt
,打印此文件
1112283569;AOEEEEAOAO.;*;*;;0.00;0.;;;;;;;;;00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149
;CONE:;*;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;;;79149449.66;0.00
1112283569;aoeeeaao;*;*;;0.00;0.;;;;;;;;;00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149
;圆锥体:;*;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;;;79149449.66;0
我使用了示例输入和输出,因为我没有完全理解描述。我只能希望这是对问题的正确解释。有没有办法扭转if语句,基本上-如果条件不适用,打印行,我尝试了!=~,没有错误,但显然不起作用。如果没有,我也试过了。基本上,如果第三个定界符后面有*的话,不要打印该行。@onlyf要还原if
语句,请使用除非,而不是if
(我不建议使用它,因为它很难看),或者使用~
而不是像PerlDog说的那样=~
@onlyf,你可以使用~
,因此如果不存在匹配项,if
将计算为true。如果(不是/regex/)
(或者像PerlDog说的那样使用,除非
),您也可以显式地否定它。谢谢你们。我真的很感谢你的帮助。
1112283569;AOEEEEAOAO.;*;*;;0.00;0.;;;;;;;;;00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;79149
;CONE:;*;*;;0.00;0.00;0.00;0.00;79149449.66;0.00;79149449.66;0.00;;;79149449.66;0.00