#! /usr/bin/perl
use strict;
use warnings;
use File::Spec::Functions qw( catfile );
my $textfile = '/tmp/massig_text.txt';
my $outputdir = '/tmp';
# eingabedatei lesend oeffnen
open my $fh, '<', $textfile or die "$textfile: $!\n";
# hilfsvariablen fuer die while-schleife
my $vorige_nummer;
my $wh = undef; # schreibhandle
while ( my $line = <$fh> ) {
# see perldoc perlvar
local $, = local $\ = "\n";
# perldoc -f split
my ( $nummer, $feld, $inhalt ) = split /\s+/, $line, 3;
chomp $inhalt;
# sind wir am anfang oder hat $nummer einen neuen Wert?
if ( not defined $vorige_nummer or $nummer != $vorige_nummer ) {
# $wh ist definiert, somit muss die ausgabe fuer die
# aktuelle datei beendet werden;
if ( defined $wh ) {
print $wh xml_outro();
close $wh or die "$outfile: $!\n";
# $wh muss undef sein, damit open den skalar wieder nutzen kann
# perldoc -f open
$wh = undef;
}
# Ausgabedatei benennen
my $outfile = catfile( $outputdir, "$nummer.xml" );
# eigentlich open my $wh; aber wir betreiben recycling ;)
open $wh, '>', $outfile or die "$outfile: $!\n";
# xml intro ausgeben
print $wh xml_intro( $nummer );
}
# aktuelles feld ausgeben
print $wh xml_field( $feld, $inhalt ) or die "cannot print to output file: $!";
# nummer merken
$vorige_nummer = $nummer;
}
# letzte XML Datei abschliessen
if ( defined $wh ) {
print $wh xml_outro();
close $wh or die "$outfile: $!\n";
$wh = undef;
}
close $fh or die "$textfile: $!\n";
sub xml_field {
my ( $feldname, $inhalt ) = @_;
return sprintf '%s', @_;
}
sub xml_intro {
return sprintf "\n%s", $_[0];
}
sub xml_outro {
return "";
}
__END__