#! /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__