将文本部分块方式地插入到数组perl中

时间:2016-12-13 14:07:09

标签: arrays perl text

我的问题是,我想分解文件并将碎片插入数组中。

从NONVSAM(整行)到PC文件(整行)。

所以在$ array [0]中我保存了第一个块,在$ array [n]中保存了最后一个块。

我有一个这样的文件:

NONVSAM - XXXPROD.YYY.XLIST

Y A DynP LSEQ 0 0 00000000 00000000 20150807 87654321

PC文件 - / shared / xx / dir / dir2 / xxx /

NONVSAM - XXXPROD.ZZZ.XYZZZ

Y A DynP LSEQ 0 0 00000000 00000000 20150807 12345678

PC文件 - / shared / xx / dir / dir2 / xxx / ...

...

...

2 个答案:

答案 0 :(得分:0)

这是一种完成工作的方法:

#!/usr/bin/perl
use Modern::Perl;
use warnings;
use Data::Dumper;

my @arr;
my @tmp;
while(<DATA>) {         # read the file one line at a time
    chomp;              # remove the linebreak
    push @tmp, $_;      # store the line in a temporary array
    if (/^PC File/) {   # if the line begins with PC File
        push @arr, join"\n",@tmp;   # Sat=ve all the line in the result array
        @tmp = ();      # re-init the temp array
    }
}
say Dumper\@arr;

__DATA__
NONVSAM - XXXPROD.YYY.XLIST
Y A DynP LSEQ 0 0 00000000 00000000 20150807 87654321
PC File - /shared/xx/dir/dir2/xxx/
NONVSAM - XXXPROD.ZZZ.XYZZZ
Y A DynP LSEQ 0 0 00000000 00000000 20150807 12345678
PC File - /shared/xx/dir/dir2/xxx/ ...

<强>输出:

$VAR1 = [
          'NONVSAM - XXXPROD.YYY.XLIST
Y A DynP LSEQ 0 0 00000000 00000000 20150807 87654321
PC File - /shared/xx/dir/dir2/xxx/',
          'NONVSAM - XXXPROD.ZZZ.XYZZZ
Y A DynP LSEQ 0 0 00000000 00000000 20150807 12345678
PC File - /shared/xx/dir/dir2/xxx/ ...'
        ];

答案 1 :(得分:0)

如果NONVSAM行始终跟在NONVSAM行之后,那么每次$ main.pl data.txt 出现时只需启动一个新的数组元素就可以轻松完成此操作

此程序需要命令行上输入文件的路径,如此

Data::Dump

请注意,我仅使用@data来显示use strict; use warnings 'all'; my @data; while ( <> ) { push @data, '' if /^NONVSAM/; $data[-1] .= $_; } use Data::Dump; dd \@data; 数组的最终内容

main.pl

[
  "NONVSAM - XXXPROD.YYY.XLIST\nY A DynP LSEQ 0 0 00000000 00000000 20150807 87654321\nPC File - /shared/xx/dir/dir2/xxx/\n",
  "NONVSAM - XXXPROD.ZZZ.XYZZZ\nY A DynP LSEQ 0 0 00000000 00000000 20150807 12345678\nPC File - /shared/xx/dir/dir2/xxx/\n",
]

输出

{{1}}