Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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
如何在perl中进行多行模式匹配_Perl_Pattern Matching - Fatal编程技术网

如何在perl中进行多行模式匹配

如何在perl中进行多行模式匹配,perl,pattern-matching,Perl,Pattern Matching,我尝试在一行上进行模式匹配,该行的值参数扩展到多行。我的输入文件看起来像 输入文件内容 我没有意识到输入文件及其格式中所有可能的数据块组合。如果我误解了,告诉我 认为您的文件具有这样的格式: someblock1 -option1 value -option2 value someblock2 -option1 value -option2 value ... config -option1 value -option2 value ... someblockN -option1 value -

我尝试在一行上进行模式匹配,该行的值参数扩展到多行。我的输入文件看起来像

输入文件内容
我没有意识到输入文件及其格式中所有可能的数据块组合。如果我误解了,告诉我

认为您的文件具有这样的格式

someblock1 -option1 value -option2 value
someblock2 -option1 value -option2 value
...
config -option1 value -option2 value
...
someblockN -option1 value -option2 value
您希望使用多行模式将所有
config
-block转换为标量变量。因为此块可能包含换行符


下面是一些代码,它不需要循环就可以完成这样的任务:

use strict;
use warnings;

open  my $fh, '<file' or die "$!\n"; my $file = join '', <$fh>; close $fh;
$file =~ /config.*?-value\s?\{.*?"(\w)"\s*\}.*?\1\s?:.*?(?:\n|$)/s;
print $&;
使用严格;
使用警告;

打开下面的$fh,“RegExp命令应匹配

/^\s*-temp[\s*{}\“[a-z]+]*/gim

使用在线regexp coach对其进行测试


m
标志可以帮助您。如下所示:
/m
。阅读我尝试过的内容,但没有帮助,它只捕获第一行,如果($\u=~ m/^\s*-temp\s*\{(.+)\}/gi)循环在哪里,从那里是
$\uuu
?发布您尝试的完整代码片段。您想要得到什么?一个A、B、C……的数组?while(){chomp$\uu;if($\uu=~m/^\s*-temp\s*\{(.+)\}/gi……},它只返回upto-temp{“A”}请回答您的问题并在那里添加您的代码。在注释中很难阅读。还要添加一个更完整的输入数据示例。
\n
是在数据文本中,还是您将它们放在那里是为了显示它有几行?谢谢重做。我可以将其设置为变量而不是数组。实际上,行是以其他模式和-t开头的EMP位于中间,所以将数组放入这里是不有用的。ABC:CDE -显示1种类型的选择-默认的“A”-值{{“} \ n{”b} \n{“C”}。-隐藏0@DiveshRastogi您应该指定可以显示的输入类型以及您希望检索的内容。请编辑您的问题,然后继续…ABC::CDE-显示1-类型选择-默认“A”-值{“A”}\n{“B”}\n{“C”}-文本“钉住它”-隐藏0
someblock1 -option1 value -option2 value
someblock2 -option1 value -option2 value
...
config -option1 value -option2 value
...
someblockN -option1 value -option2 value
use strict;
use warnings;

open  my $fh, '<file' or die "$!\n"; my $file = join '', <$fh>; close $fh;
$file =~ /config.*?-value\s?\{.*?"(\w)"\s*\}.*?\1\s?:.*?(?:\n|$)/s;
print $&;