根据关键字将文件内容拆分为2个数组

Ran*_*cho 3 arrays perl split

我有一个类似的文件

line1
line2
line3
line4
.endm
line5
line6
line7
line8
.endm
Run Code Online (Sandbox Code Playgroud)

我想将此文件拆分为.endm并将内容放在2个不同的数组中.输出将是

@array1=(line1,line2,line3,line4);
@array2=(line4,line6,line7,line8);
Run Code Online (Sandbox Code Playgroud)

我试过用

@array = split(".endm",my_file.txt);
print("Array1 = $array[1]\nArray2 = $array[2]\n);
Run Code Online (Sandbox Code Playgroud)

但这只是打印出最后一个.endm的行号

我也尝试了类似的东西

#! /usr/intel/bin/perl -w
use strict;

my $count=0;
open(my $fh, "<", "a.txt")|| die "can't open UTF-8 encoded filename: $!";
my @lines = <$fh>;
my @array;

LOOP: foreach my $line (@lines) {
    chomp ($line);
    $count = $count+1;
    push (@array,$line);  
    if ($line =~ m/.endm/) {
        pop (@array);
        last LOOP;
    }
}
print("Array : @array\n");
close $fh;
Run Code Online (Sandbox Code Playgroud)

这个打印@array=(line1,line2,line3,line4);但我仍然需要其他4行,以便我可以把它放在一个不同的数组

那么如何根据某些关键字拆分文件呢?

TLP*_*TLP 5

如果您将固定字符串作为字段分隔符,则可以设置内置变量$/(输入记录分隔符)以更改Perl readline()函数读取行的方式.

perl -MData::Dumper -we '$/=".endm\n"; chomp(@a = <>); 
      @a = map [ split /\n/ ], @a; print Dumper \@a;' file.txt
Run Code Online (Sandbox Code Playgroud)

这将以两个块的形式读取文件,有效地拆分.endm\n.请注意,从字符串末尾chomp删除值$/.map这里的语句只是将输入拆分为换行符并将其放入数组ref中.结果数组是二维的,如Data::Dumper输出中所示:

输出:

$VAR1 = [
          [
            'line1',
            'line2',
            'line3',
            'line4'
          ],
          [
            'line5',
            'line6',
            'line7',
            'line8'
          ]
        ];
Run Code Online (Sandbox Code Playgroud)

完整版看起来像这样:

use strict;
use warnings;
use Data::Dumper;

$/ = ".endm\n";
chomp(my @a = <>);
@a = map [split /\n/], @a;
print Dumper \@a;
Run Code Online (Sandbox Code Playgroud)