В Perl, как я могу соединить строку ввода со следующей, только если выполняется какое-то условие?

#perl

#perl

Вопрос:

Мои строки

 Line: foobar, foo
Line: webar, webar, we
Line: 
abcabc
abc
Line: 
xyzxyz
xyz
  

Что я хочу сделать, так это объединить их в одну строку:

 Line: foobar, foo
Line: webar, webar, we
Line: abcabc, abc
Line: xyzxyz, xyz
  

Комментарии:

1. Я предполагаю, что где-то есть какая-то школа или работодатель, задающий этот вопрос. Похоже, что существует множество вопросов о том, как мне соединить одну строку со следующей, если что -то задает вопросы. Для выполнения операции: как вы думаете, что произойдет, если вы пройдете, не зная, или возьметесь за работу, не понимая?

Ответ №1:

Один из методов — прочитать весь файл и разделить на nLine: , а затем выполнить некоторые исправления данных.

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

my $data = <<EOF;
Line: foobar, foo
Line: quxbar, quxbar, quxx
Line: 
abcabc
abc
EOF

$data =~ s/^Line: //;
my @lines = split("nLine: ", $data);
s/n/, /g for @lines;

print join "n", map { "Line: $_" } @lines;
  

Комментарии:

1. Запустите свой код — после 3-го есть дополнительный , Line:

Ответ №2:

script.pl:

 #!/usr/bin/perl -w

my @lines;

while(<>) {
        chomp;

        if(m/^Line: /) {
                push @lines, $_;
        }
        else {
                if(length $lines[-1] == 6) {
                        $lines[-1] .= $_;
                }
                else {
                        $lines[-1] .= ", $_";
                }
        }
}

print "$_n" for @lines;
  

Сохраните свой пример ввода в виде файла и запустите

 cat file | perl script.pl
  

Комментарии:

1. ‘Cat’ — ненужная трата процесса. Просто сделайте: perl script.pl файл

2. say for @lines выглядит немного лучше.

3. @TLP: да, я согласен, но я стараюсь избегать функций, которые недоступны в Perl5 по умолчанию, если я не знаю, что у нас есть недавний Perl.

4. С другой стороны, вы должны поощрять людей к обновлению до новых версий perl и новых функций.