Ein Perl-Skript, das ich schreibe, muss eine Datei parsen, die Fortsetzungszeilen wie ein Makefile hat. h. Zeilen, die mit Leerzeichen beginnen, sind Teil der vorherigen Zeile.Cleanster Perl-Parser für Makefile-ähnliche Fortsetzungszeilen
ich den Code unten geschrieben, aber nicht das Gefühl, wie es ist sehr sauber oder Perl-ish
Es gibt viele Grenzfälle (Heck, es auch nicht verwenden „Redo“!): EOF bei ungeraden Orte, Einzeilendateien, Dateien, die mit einer leeren Zeile (oder einer leeren Zeile oder einer Fortsetzungszeile) beginnen oder enden, leere Dateien. Alle meine Testfälle (und Code) sind hier: http://whatexit.org/tal/flatten.tar
Können Sie sauberer, Perl-ish Code schreiben, der alle meine Tests besteht?
#!/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;
Eine Sache im Auge zu tragen sowohl mit mir und Antworten Mirod ist, dass es eine gute Idee wäre, die speziellen Variablen zu lokalisieren, wenn Sie dies in einem größeren Stück Code einbetten (zB ‚local $ /‘) –
Ich habe gerade codiert, um die Tests zu bestehen ;-) Du hast aber Recht. – mirod
@mirod - heh. Das ist fast identisch mit einer Übung im Perl-Intro-Kurs, den ich lehre (es geht darum, Mail-Header zu entwickeln). Es ist wahrscheinlich ein ziemlich häufiges Problem mit * so * vielen Möglichkeiten, es zu tun :) –