perl - 通过将 2 个模式之间的行写入新文件,将文件拆分为多个文件

标签 perl

这是输入文件:

#cat myfile
-- START
whatever
whatever
-- END

-- START
whatever
whatever
-- END

-- START
whatever
whatever
-- END

-- START
whatever
whatever
-- END

我需要抓取 -- START-- END 之间的行并将这些行写入单独的文件。因此,在这个用例中,我应该创建 4 个文件,如下所示:

# cat file1
whatever
whatever

# cat file2
whatever
whatever

# cat file3
whatever
whatever

# cat file4
whatever
whatever

这是我的代码:

#!/usr/bin/perl
use strict;
use warnings;

open (my $fh, "<", "/var/tmp/myfile");
my $counter = 0;

while (<$fh>)
{
    if (/START/../END/)
    {
        my $filename = "/var/tmp/file".$counter;
        open (my $oh, ">", $filename);
        print $oh $_;
    }
    $counter++;
}

问题:我的代码正在为 -- START-- END 中的每一行创建一个文件

您能帮我弄清楚如何修复此代码吗?谢谢。

最佳答案

不应为每一行打开新文件,而应在每个范围的开头打开它。

使用范围的返回值来确定何时打开文件并仅打印边界条件之间的那些行。

my $oh;
while (<$fh>) {
    if ( my $range = /START/ .. /END/ ) {
        # Start of Range - Open the file handle
        if ( $range == 1 ) {
            my $filename = "/var/tmp/file" . $counter++;
            open( $oh, ">", $filename ) or die $!;

        # Print until End of Range
        } elsif ( $range !~ /E/ ) {
            print $oh $_;
        }
    }
}

关于perl - 通过将 2 个模式之间的行写入新文件,将文件拆分为多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25783922/

相关文章:

perl - 为什么我的 CGI 脚本提示 "Can' t locate CGI/Session.pm in @INC”?

regex - 此正则表达式替代 “$content =~ s/\n—\n.*?$//s”到底在做什么?

regex - 格式化 perl 正则表达式捕获组

php - mysql 或 perl 函数匹配 Asterisk 拨号方案模式

perl - Mojolicious 自定义 session

regex - Perl 包含匹配变量的替换字符串的安全插值

perl - 如何将 $_ 的值更改为 perl 中 grep 中所需的值?

arrays - Perl 中数组的问题

Perl 困境 - 分配和返回哈希

perl - 捕获前 8 个字符 Perl