1

可能重复:
如何在 Perl 中跳出循环?

我的数据看起来像你在下面看到的。我正在尝试创建一个将捕获选定文本的 perl 脚本。我的想法是说“如果前一行读取的都是 - 并且当前读取的行都是 = 则停止读取文件并且不要打印那些只有 = 和 - 的行.

但是,我不知道如何编码。我 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
-------------------------------------------------------------------------------
===============================================================================
BLAH BLAH
===============================================================================
...

我想要捕捉的东西

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

2 回答 2

1

逐行处理不太适合,因为您的边界跨越了行尾。Slurp 整个文件,然后使用匹配运算符提取中间部分。

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;
于 2012-07-12T15:12:28.947 回答
0

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

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

如果您只想要第一个块,请将分隔符从 更改/?

 perl -ne 'm?^---?...m?^---? and print' file

请参阅范围运算符讨论。

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

perl -ne 'm/^---/...m?/---/ and print' file > myoutput
于 2012-07-12T15:17:04.017 回答