Thread Sortierprogramm lexikografisch aus Datei (12 answers)
Opened by Andreas at 2012-10-09 23:08

FIFO
 2012-10-10 08:46
#162581 #162581
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Guest Andreas
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
print "Bitte geben Sie den Dateinamen an: \n";
$datei = <STDIN>;
chop $datei;

if(not ( (-e $datei) or (-s $datei)))
{
        die ("Die Datei ist leer oder existiert nicht\n");
}
open (EINGABE, "<$datei") || die $!;
while (<EINGABE>) {
print "\n$_\n";
}
close (EINGABE);
print "\nIhre Datei wurde nun Lexikografisch sortiert\n";
<>


Du sollst also die Zeilen der Datei sortiert in der DOS-Box ausgeben? Dann lies die Datei in ein Array ein, und gib das sortierte Array aus. Ggf. musst Du die Sortiervorschrift anpassen (Groß-/Kleinschreibung ignorieren, Umlaute einsortieren, z.B. phonebook search ...).
Du solltest Dir gleich zu Beginn einige Dinge zur besseren/sichereren Perl-Programmierung angewöhnen: strict und warnings verwenden, lexikalische Filehandles und die 3-Argument-Form von open.
In Deinem Code ist die logische Bedingung in der if-Konstruktion verkehrt (and statt or, wenn beides erfüllt sein soll). Den Test auf Existenz (-e) kannst Du weglassen, wenn Du nur nicht-leere Dateien zulässt (-s). Verwende besser chomp statt chop.
Schließe auch die letzte Codezeile mit einem Semikolon.

Hier Dein Code mit den genannten Änderungen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use warnings;
use strict;
print "Bitte geben Sie den Dateinamen an: ";
my $datei = <STDIN>;
chomp $datei;

if (not -s $datei) {
    die ("Die Datei ist leer oder existiert nicht.\n");
}
open (my $EINGABE, '<', $datei) or die "Can't open $datei: $!\n";

my @zeilen = <$EINGABE>;

@zeilen = sort @zeilen;

print $_ foreach @zeilen;

close ($EINGABE);

print "\nIhre Datei wurde nun Lexikografisch sortiert. [OK] ";
<STDIN>;


sort() ohne weitere Angaben sortiert einfach nach Zeichencodes, d.h. Großbuchstaben vor Kleinbuchstaben, Umlaute je nach verwendeter Codepage.

Wenn Du ausgefeiltere Sortierungen brauchst, schreib Dir am besten eine Sortiervorschrift in einer eigenen Funktion. dafür gibt es mehrere Vorgehensweisen, z.B. kann man die globalen Variablen $a und $b verwenden (im Beispiel case-independent):

Code (perl): (dl )
1
2
3
sub sortiervorschrift {
    return lc($a) cmp lc($b);
}

und ersetze die Zeile mit sort im Skript durch
Code (perl): (dl )
@zeilen = sort sortiervorschrift @zeilen;
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"

View full thread Sortierprogramm lexikografisch aus Datei