Perl-如果多行匹配,则停止读取文件

Perl-如果多行匹配,则停止读取文件,perl,file-io,Perl,File Io,可能重复: 我有一些数据,看起来像你在下面看到的。我正在尝试创建一个perl脚本来捕获选定的文本。我的想法是“如果前一行读取的是all-'s,而当前行读取的是all='s,那么停止读取文件,不要只使用='s和-'s打印这些行 但是,我不知道如何编写代码。我3天前才开始使用perl。我不知道这是否是最好的方法。请告诉我是否有更好的方法。 无论哪种方式,如果你能帮我写代码,我都会很感激的 到目前为止,我的代码是: ... $end_section_flag = "true" # I was goi

可能重复:

我有一些数据,看起来像你在下面看到的。我正在尝试创建一个perl脚本来捕获选定的文本。我的想法是“如果前一行读取的是all-'s,而当前行读取的是all='s,那么停止读取文件,不要只使用='s和-'s打印这些行

但是,我不知道如何编写代码。我3天前才开始使用perl。我不知道这是否是最好的方法。请告诉我是否有更好的方法。 无论哪种方式,如果你能帮我写代码,我都会很感激的

到目前为止,我的代码是:

...
$end_section_flag = "true" # I was going to use this to signify 
                           # when I want to stop reading
                           # ie. when I reached the end of the
                           # data I want to capture

while (<$in-fh>)
{
    my $line = $_;
    chomp $line;

    if ($line eq $string)
    {
        print "Found it\n";
        $end_section_flag = "false";
    }

    if ($end_section_flag eq "false" )
    {
        print $out-fh "$line\n";
        // if you found the end of the section i'm reading
        // don't pring the -'s and ='s and exit
    }
}
我想要捕捉的是什么

-------------------------------------------------------------------------------
===============================================================================
BLAH BLAH
===============================================================================
asdfsad
fasd
fas
df
asdf
a
\n
\n

逐行处理不太合适,因为您的边界与行尾交叉。请将整个文件拼凑起来,然后使用匹配运算符提取中间部分

use strictures;
use File::Slurp qw(read_file);
my $content = read_file 'so11454427.txt', { binmode => ':raw' };
my $boundary = qr'-{79} \R ={79}'msx;
my (@extract) = $content =~ /$boundary (.*?) $boundary/gmsx;

逐行处理不太合适,因为您的边界与行尾交叉。请将整个文件拼凑起来,然后使用匹配运算符提取中间部分

use strictures;
use File::Slurp qw(read_file);
my $content = read_file 'so11454427.txt', { binmode => ':raw' };
my $boundary = qr'-{79} \R ={79}'msx;
my (@extract) = $content =~ /$boundary (.*?) $boundary/gmsx;

看看这是否适合您的需要:

 perl -ne 'm/^---/...m?/---/ and print' file
如果只需要第一个块,请将分隔符从
/
更改为
,从而:

 perl -ne 'm?^---?...m?^---? and print' file
请参阅操作员讨论

这将打印以“---”为边界的行范围。您可以使用shell的重定向将输出重定向到您选择的文件中:

perl -ne 'm/^---/...m?/---/ and print' file > myoutput

看看这是否适合您的需要:

 perl -ne 'm/^---/...m?/---/ and print' file
如果只需要第一个块,请将分隔符从
/
更改为
,从而:

 perl -ne 'm?^---?...m?^---? and print' file
请参阅操作员讨论

这将打印以“---”为边界的行范围。您可以使用shell的重定向将输出重定向到您选择的文件中:

perl -ne 'm/^---/...m?/---/ and print' file > myoutput

您没有以粗体显示任何文本。现实世界中的示例应该会有所帮助。从您的问题中不清楚您想要实现什么。显示:1.)您有什么2.)以及您想要得到什么3.)输入什么变量。您的代码没有任何关于内容的条件-“$end\u section\u标志”“什么也没说。你对
-
=
的想法还不清楚。你还没有用粗体显示任何文本。现实世界的例子应该会有所帮助。”。从你的问题来看,不清楚你想要实现什么。展示:1)你有什么2)和你想要什么3)进入什么变量。您的代码没有任何关于内容的条件-“$end\u section\u标志”还没有说明任何内容。您对
-
=
的概念还不清楚。我是Perl新手,请您解释一下代码好吗?谢谢:)我将文件内容读入一个字符串变量。然后我定义了边界,79个破折号和一些换行符以及79个等号。然后我根据内容字符串匹配边界以及中间的边界。我捕获中间值并将其分配给一个变量。我是Perl新手,请您解释一下代码好吗?谢谢:)我将文件内容读入一个字符串变量。然后我定义了边界,79个破折号和一些换行符以及79个等号。然后我根据内容字符串匹配边界以及中间的边界。我捕获中间的变量并将其分配给一个变量。我不理解这段代码。它去哪里了?它是如何适应的?它在干什么?对不起,我还是Perl新手。请澄清一下,我不明白这个代码。它去哪里了?它是如何适应的?它在干什么?对不起,我还是Perl新手。请澄清。