В Perl, как я могу соединить строку ввода со следующей, только если первая заканчивается двоеточием? - PullRequest
0 голосов
/ 05 ноября 2011

Мои строки:

ABC: XYZ
XYZ ABC: XYZ
XYZ:
ABC
XYZ
ABC:
AAB
CCD

Я хочу соединить строки, заканчивающиеся двоеточием, следующей строкой:

ABC: XYZ
XYZ ABC: XYZ
XYZ: ABC
XYZ
ABC: AAB
CCD

Ответы [ 6 ]

1 голос
/ 05 ноября 2011
#!/usr/bin/env perl

use strict;
use warnings;

my $emit_eol;

while( my $line = <DATA> ) {
    $emit_eol = ($line =~ s/ : \s+ \z /: /x);
    print $line;
}

print "\n" if $emit_eol;

__DATA__
ABC: XYZ
XYZ ABC: XYZ
XYZ:
ABC
XYZ
ABC:
AAB
CCD:
1 голос
/ 05 ноября 2011

Если вы просто хотите исправить файл, используйте следующую командную строку:

% perl -i.orig -pe 'chomp if /:$/' yourfile

Если вы находитесь в цикле ввода и хотите обнять записи, заканчивающиеся двоеточиями, выполните:

while (<>) {
    chomp;
    if (/:$/ && !eof) {
         $_ .= <>;
         redo unless eof;
    }
    # now you have your cuddled line(s), proceed as before
    ...
}

Предполагается, что последняя строка вашего файла не является строкой продолжения.

1 голос
/ 05 ноября 2011

Моя попытка получить более эстетически привлекательную версию.

while (<DATA>) {
  chomp;
  print $_;
  print /:$/ ? " " : "\n";
}

Старая, неприятная попытка.Этот ответ только сохраняет текущую строку в памяти, он не требует сглаживания ввода или построения всего вывода в памяти.Он также обрабатывает пустые данные правильно, без распечатки, если нет ввода.

#!/usr/bin/env perl

use strict;
use warnings;

my $text;
while( my $line = <DATA> ) {
  if ($line =~ /:\s*\n/ && defined $text) {
      print $text;
      undef $text;
  }
  $line =~ s/:\s*\n/: /g;
  $text .= $line;
}
print $text if defined $text;

__DATA__
ABC: XYZ
XYZ ABC: XYZ
XYZ:
ABC
XYZ
ABC:
AAB
CCD
1 голос
/ 05 ноября 2011

Если содержимое помещается в память, загрузите его в одну переменную и сделайте следующее:

$text =~ s/:\n/: /g
0 голосов
/ 05 ноября 2011

Оба предложения до сих пор рекомендуют выгружать файл в память, однако это не является обязательным, учитывая исходный вопрос.

#!/usr/bin/env perl

use strict;
use warnings;

my $text;
while( my $line = <DATA> ) {
    if ($line =~ s/ : \s+ \z /: /x) {
        $text .= $line;
    }
    else {
        print $text if is_nonempty_string($text);
        print $line;
        $text = '';
    }
}

print $text, "\n" if is_nonempty_string($text);

sub is_nonempty_string { defined($_[0]) and length($_[0]) }

__DATA__
ABC: XYZ
XYZ ABC: XYZ
XYZ:
ABC
XYZ
ABC:
AAB
CCD:
0 голосов
/ 05 ноября 2011
my $text;
{
  local $/= "";
  $text = <DATA>;
  $text =~ s/:\n/: /g;
}
print $text;

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