2012-03-23 19 views
2

私は複数行のレコードを読み、正確に40行まで整理する必要があります。その後、 は45行になります。彼らは70 +ラインと同じくらい大きいかもしれません。これらのレコードは、最終的に45行になるためには、 が必要です。Perl:複数行レコードを整える

レコードセパレータは、パターン/ ^#matchee /で始まる行です。

$ /を#matcheeに設定するとします。

{ 
    $/ = "#matchee"; 

    while (<>) { 
     # I need to print first 40 
     # lines of each record then 
     # pad to 45 with delimiter as 
     # last line. 
    } 
} 

サンプルレコードこれは非常に適切ではない$/ = "#matchee";

使用するための

REDUNDANCY DEPARTMENT 
Anonymous Ave 

Item 1 
Item 2 



<bunch of blank lines> 
#matchee 

答えて

1

ここに私の解決策だ...

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

{ 
    $/ = "#matchee"; 

    while (my @line = split "\n", <>) { 

    # print first 40 lines of record 
     for my $counter (0..39) { 
      print($line[$counter] . "\n"); 
     } 

     # pad record with four extra blank lines 
     # (last record already ends with a newline) 
     print "\n" x 4; 
    } 
} 

1 ...最初のレコード45行あり、2行目は44行です。

+1

'for my $ counter(0..39){...}' – vol7ron

+0

良い提案。それに応じてコードを編集しました。 –

+0

Perlのそれ以降のバージョンを使用している場合、 'print 'の代わりに' say' ... ";'を実行することができます... \ n ";'、しかし、 。また、 '#!/ usr/bin/...'(空白なし)でなければなりません。 – vol7ron

1

「レコードセパレータは/ ^#matchee /で始まる行です」と指定します。これは、$/a special string, but not a regexであるため、レコードの分離をやや複雑にします。あなたの出力が同じレコードセパレータを使用しているかどうかは指定していませんが、私はそのように仮定します。ここでうまくいくようなアプローチがあります。

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

sub take_and_pad_lines { 
    my ($str, $take, $pad) = @_; 

    my @lines = (split(/\n/, $str))[0..$take-1]; 
    return join "\n", @lines, ('') x ($pad - $take); 
} 


{ 
    $/ = "#matchee"; 

    while (my $record = <>) { 
    # because RS is really begins-with we must clean up first line 
    # and double check last record 
    unless (1 == $.) { 
     $record =~ s/\A.*\n//m; 
     last if eof() && $record eq ''; 
    } 

    print take_and_pad_lines($record, 40, 45), "\n"; 
    print "$/\n" unless eof(); 
    } 
} 
+0

Aha。これは、最初のレコードと2番目のレコードに含まれる改行数が異なる理由を説明しています。最初のレコードは区切り文字で始まらず、残りの行より1行短くなっています。 –

+0

私はこれを撃つでしょう。ありがとう! – Bubnoff

+0

@Bubnoffはあなたのためにこの作品を出しましたか? – dbenhur

関連する問題