Namensliste mit Perl durchsuchen
Bastian Kurz
- perl
Hallo.
Ich bin kein Perl-Programmierer, muß aber jetzt notgedrungen damit arbeiten und ich erinnere mich nur noch ganz schwach an das, was ich mir mal ein wenig begebracht hatte.
Mir liegt eine Liste mit Namen vor. Pro Zeile steht ein Name.
Ich muß jetzt ein Perl-Script so umschreiben, daß dort nicht einfach nur ein Name ans Ende gehängt wird, sondern vorher überprüfen, ob der Name bereits schon vorhanden ist.
Ich weiß hier aber leider nicht, wie ich vorgehen soll. Das sind ca. 4000 Namen. Es ist nicht mehr sinnvoll, die alle in ein Array einzulesen und dieses dann zu durchsuchen, oder etwa doch?
Leider sitze ich hier gerade vor einem Rechner auf dem kein Perl installiert ist und ich kann nicht testen.
(Später hab ich dann Perl, aber kein Internet mehr. Darum frage ich mal besser jetzt nach.)
Könnte sowas funkionieren?
open( DATEI, "<liste.txt" ) || die "Datei nicht gefunden";
while ( $zeile = <DATEI> )
{
@NamenListe = "$zeile";
}
close(DATEI);
if !exists $NamenListe{'name'}
{
// irgendwie Eintrag vornehmen
}
Und wie wäre es mir möglich, gezielt einen bestimmten Namen aus der Liste zu löschen?
Auch wieder alles in ein Array einlesen, einen Eintrag aus dem Array löschen und damit die Datei überschreiben?
Mit welcher Funktion lösche ich einen Array-Eintrag? Das Arrayelement müßte dann wohl am besten verschwinden und nicht einfach nur mit einem Leerstring überschrieben werden.
Oder sollte ich besser anders vorgehen?
Danke für jede Hilfe.
Gruß, Basti
Tag Bastian.
open( DATEI, "<liste.txt" ) || die "Datei nicht gefunden";
while ( $zeile = <DATEI> )
{
@NamenListe = "$zeile";
}
Besser wäre:
while( <DATEI> ) {
push @Namensliste, chomp($_);
}
if !exists $NamenListe{'name'}
{
// irgendwie Eintrag vornehmen
}
So geht es nicht, du hast ein Array, kein Hash definiert, das müsstest du noch über einen Hash-Slice erledigen:
my %Namen;
@Namen{@NamensListe} = ();
Aber warum willst du die komplette Namensliste in ein Array schreiben, vergleiche doch beim Auslesen, ob es den Namen bereits gibt:
my $name = 'Pumpernickel';
open( DATEI, "<liste.txt" ) || die "Datei nicht gefunden";
my $seen = 1;
while ( <DATEI> ) {
last if chomp($_) eq $name;
$seen = 0;
}
if($seen == 1) {
# gefunden
}
else {
print DATEI $name;
}
close DATEI;
(ungetestet, und schöner geht's bestimmt auch)
Und wie wäre es mir möglich, gezielt einen bestimmten Namen aus der Liste zu löschen? Auch wieder alles in ein Array einlesen, einen Eintrag aus dem Array löschen und damit die Datei überschreiben?
Das wäre wohl dann der einfachste Weg. Es gibt da noch das Modul Tie::File, das aber letztlich auch auf den Dateiinhalt via Array zugreift.
Mit welcher Funktion lösche ich einen Array-Eintrag?
Am elegantesten mit splice.
Siechfred
Hallo,
Mir liegt eine Liste mit Namen vor. Pro Zeile steht ein Name.
Ich muß jetzt ein Perl-Script so umschreiben, daß dort nicht einfach nur ein Name ans Ende gehängt wird, sondern vorher überprüfen, ob der Name bereits schon vorhanden ist.
Ich weiß hier aber leider nicht, wie ich vorgehen soll. Das sind ca. 4000 Namen. Es ist nicht mehr sinnvoll, die alle in ein Array einzulesen und dieses dann zu durchsuchen, oder etwa doch?
man könnte die Namen gleich in einen Hash einlesen. Doppelte Namen fallen dabei raus:
my %NamenListe;
open( DATEI, "<liste.txt" ) || die "Datei nicht gefunden";
while ( my $zeile = <DATEI> ){
$zeile=~s/\s+$//;
$NamenListe{$zeile}=1;
}
close(DATEI);
open( DATEI, ">ausgabe.txt" ) || die "Datei nicht gefunden";
for(sort(keys(%NamenListe))){
print DATEI "$_\n";
}
close(DATEI);
Und wie wäre es mir möglich, gezielt einen bestimmten Namen aus der Liste zu löschen?
Auch wieder alles in ein Array einlesen, einen Eintrag aus dem Array löschen und damit die Datei überschreiben?
Mit welcher Funktion lösche ich einen Array-Eintrag? Das Arrayelement müßte dann wohl am besten verschwinden und nicht einfach nur mit einem Leerstring überschrieben werden.
delete($NamenListe{'Pumpernickel'});
Gruß, Christoph