Perl: обрезать многострочные записи - PullRequest
2 голосов
/ 24 марта 2012

Мне нужно прочитать многострочные записи и урезать их до ровно 40 строк. затем дополнить их до 45 строк. Они могут достигать 70 + строк. Эти записи нужны в конечном итоге 45 строк.

Разделитель записей - это строка, начинающаяся с шаблона /^#matchee/.

Я предполагаю, что вы установите $ / в # matchee.

{
    $/ = "#matchee";

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

Пример записи

REDUNDANCY DEPARTMENT
Anonymous Ave

Item 1
Item 2



<bunch of blank lines>
#matchee

Ответы [ 2 ]

1 голос
/ 24 марта 2012

Вы указываете, что «Разделитель записей - это строка, начинающаяся с шаблона / ^ # matchee /».Это несколько усложняет разделение записей, поскольку $/ является специальной строкой, но не регулярным выражением .Вы не указали, использует ли ваш вывод тот же разделитель записей, но я так полагаю.Вот подход, который, кажется, работает.

#!/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();
  }
}
1 голос
/ 24 марта 2012

Вот мое решение ...

#! /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 для использования $/ = "#matchee";

Это не совсем верно ... первая запись имеет 45 строк, вторая44.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...