#! /usr/bin/perl use strict; use warnings; use File::Spec::Functions qw( catfile ); my $textfile = 'Test.txt'; my $outputdir = './output'; # 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 = substr($line,0,9); my $feld = substr($line,10,5); my $inhalt = substr($line,21); 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"; #outfile noch nicht definiert?? close $wh or die "geht nix\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; } 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__