Guest Andreas
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:
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):
sub sortiervorschrift {
return lc($a) cmp lc($b);
}
und ersetze die Zeile mit
sort im Skript durch
@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"