Perl-скрипт, который я пишу, должен проанализировать файл, имеющий строки продолжения, например Makefile. то есть строки, начинающиеся с пробела, являются частью предыдущей строки.
Я написал код ниже, но не чувствую, что он очень чистый или perl-ish (черт возьми, он даже не использует «redo»!)
Существует много крайних случаев: EOF в нечетных местах, однострочные файлы, файлы, которые начинаются или заканчиваются пустой строкой (или непустой строкой, или строкой продолжения), пустыми файлами. Все мои тесты (и код) здесь: http://whatexit.org/tal/flatten.tar
Можете ли вы написать чище, perl-ish, код, который проходит все мои тесты?
#!/usr/bin/perl -w
use strict;
sub process_file_with_continuations {
my $processref = shift @_;
my $nextline;
my $line = <ARGV>;
$line = '' unless defined $line;
chomp $line;
while (defined($nextline = <ARGV>)) {
chomp $nextline;
next if $nextline =~ /^\s*#/; # skip comments
$nextline =~ s/\s+$//g; # remove trailing whitespace
if (eof()) { # Handle EOF
$nextline =~ s/^\s+/ /;
if ($nextline =~ /^\s+/) { # indented line
&$processref($line . $nextline);
}
else {
&$processref($line);
&$processref($nextline) if $nextline ne '';
}
$line = '';
}
elsif ($nextline eq '') { # blank line
&$processref($line);
$line = '';
}
elsif ($nextline =~ /^\s+/) { # indented line
$nextline =~ s/^\s+/ /;
$line .= $nextline;
}
else { # non-indented line
&$processref($line) unless $line eq '';
$line = $nextline;
}
}
&$processref($line) unless $line eq '';
}
sub process_one_line {
my $line = shift @_;
print "$line\n";
}
process_file_with_continuations \&process_one_line;