Как заставить Perl рассматривать несколько строк, разбитых на определенном символе, как одну строку? - PullRequest
1 голос
/ 25 мая 2011

Например, у меня есть текстовый файл с многострочными вызовами, прерванный на амперсанде.

command1

command2

execute myscript &
        opt1=val1 &
        opt2=val2

...

При открытии файла существует ли способ заставить Perl рассматривать эти три строки, как если бы они были одной строкой, и игнорировать &?

Ответы [ 3 ]

5 голосов
/ 25 мая 2011

Не при открытии файла. Но не так уж сложно присоединиться к ним, читая:

open(my $in, '<', 'file.txt') or die;
while (<$in>) {
  $_ .= <$in> while s/&\s*\z//;

  # $_ now contains a complete record
  ...
}
0 голосов
/ 26 мая 2011

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

0 голосов
/ 25 мая 2011

Если у вас всегда есть несколько новых строк между записями, рассмотрите возможность использования Разделитель записей для их чтения.Затем вы можете использовать быструю проверку для & и выполнить разделение / объединение:

use English '-no_match_vars'; 

sub read_records {
    local $RS = "\n\n";  # or,  for the machoistic,  $/ works too without English
    ... # open the file
    while (my $record = <$fh>) {
        chomp $record;               # uses $RS for what to remove, nice!
        if ($record =~ /&\s*$/ms) {  # & at the end of *any* line (w/only spaces)
            $record = join ' ', split /\s*&\s+/, $record; # pull them out
        }
        ... # do something with the record
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...