Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在第n个模式匹配后获取一个字符-PERL_Perl_Matching - Fatal编程技术网

在第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