3

次のようなファイルがあります

line1
line2
line3
line4
.endm
line5
line6
line7
line8
.endm

このファイルを .endm で分割し、内容を 2 つの異なる配列に配置したいと考えています。出力は次のようになります

@array1=(line1,line2,line3,line4);
@array2=(line4,line6,line7,line8);

使ってみた

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

しかし、これは最後の .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;

これは出力@array=(line1,line2,line3,line4);しますが、別の配列に配置できるように、他の4行が必要です

では、キーワードに基づいてファイルを分割するにはどうすればよいでしょうか。

4

6 に答える 6

5

フィールド区切り文字として固定文字列がある場合、組み込み変数$/(入力レコード区切り文字) を設定して、Perl のreadline()関数が行を読み取る方法を変更できます。

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

これにより、ファイルが 2 つのチャンクに分割され、効果的に分割され.endm\nます。文字列の末尾からchompの値を削除することに注意してください。$/ここでのmapステ​​ートメントは、単に入力を改行で分割し、それを配列 ref に入れます。Data::Dumper出力に見られるように、結果の配列は 2 次元です。

出力:

$VAR1 = [
          [
            'line1',
            'line2',
            'line3',
            'line4'
          ],
          [
            'line5',
            'line6',
            'line7',
            'line8'
          ]
        ];

完全版は次のようになります。

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

$/ = ".endm\n";
chomp(my @a = <>);
@a = map [split /\n/], @a;
print Dumper \@a;
于 2013-09-20T19:36:18.240 に答える
2
#!/usr/bin/perl 
use strict;
use warnings;
use Data::Dumper;

open my $fh, '<', 'data.txt' or die "can't open data.txt: $!";

my @array;

$/ = ".endm";

while (<$fh>){
    s/\.endm$//;
    push @array, [split];
}

print Dumper(@array);

#output
$VAR1 = [
         'line1',
         'line2',
         'line3',
         'line4'
        ];
$VAR2 = [
         'line5',
         'line6',
         'line7',
         'line8'
        ];
于 2013-09-20T18:52:50.240 に答える
2

シンプルに保ち、次のようにします。

my (@array1,@array2);
while ($_ = <>) { chomp; last if $_ eq '.endm'; push @array1, $_ }
while ($_ = <>) { chomp; last if $_ eq '.endm'; push @array2, $_ }
于 2013-09-20T18:43:31.003 に答える
1

ファイルのサイズが小さい場合、これは機能します。

#!/usr/bin/perl 

use strict;
use warnings;

open(FILE,"input.txt");
my @lines =<FILE>;                 # Reads all lines of the file into an array
my $line  = join('',@lines);       # Join all lines together
my @temp = split(/.endm/,$line);   # Split the line using the keyword
my @array1=split(/\n/,$temp[0]);   # Splits line back 
my @array2=split(/\n/,$temp[1]);   # Splits line back

print @array1;
print "\n";
print @array2;

close(FILE);
于 2013-09-20T18:33:37.373 に答える