Thread Probleme bei File - Handler - Änderung einer Zeile (13 answers)
Opened by YAPD at 2016-02-21 23:19

Linuxer
 2016-03-08 15:18
#184114 #184114
User since
2006-01-27
3871 Artikel
HausmeisterIn

user image
Prinzipiell geht der Code; aber ein paar Dinge sind noch anzumerken:

  • Weil's direkt ins Auge springt: Arbeite an einer konsequenten Einrückung. Entweder mit Tabulatoren oder mit Leerzeichen. Nicht im Wechsel zwischen beiden (Achte auf die Position des while in Deinem Code ).
  • Alleinstehende Skalare brauchen keine Quotes. Anstatt open( DATEI , "$datei" ) also open( DATEI , $datei )
  • Verwende lexikalische Dateihandles; siehe mein folgendes Beispiel beim open()
  • open() kann auch fehlschlagen. Hier sollte auf Erfolg oder Mißerfolg geprüft werden und nur bei Erfolg weitergemacht werden.
  • open() sollte am besten in der Drei-Argument-Form benutzt werden; zusammen ergibt das dann: open( my $handle, '<', $filename ) or die "Could not open $filename: $!";
  • Man könnte sich überlegen, die Ersetzungen pro Zeile nicht in einer extra for-Schleife zu machen, sondern direkt beim zeilenweisen Einlesen erledigen lassen.
  • Anstatt print "...", "\n"; könnte man ab v5.10.0 auch say "..." benutzen; damit wird ein "\n" am Ende automatisch ausgegeben.


Zusammen käme das dann als Beispiel raus:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use 5.010.000;
...

if( $key eq $name ) {
    say "Treffer\n\nErsetze Werte ...";

    my $datei     = "test.txt";
    my $quellwort = "$key = \Q$value\E";
    my $zielwort  = "$name = $Speicherung_Hashes{ $name }";

    say "Vorhandene Variable : $value";
    say "Ersetzende Variable : $Speicherung_Hashes{ $name }";

    my @Zeilen;

    open( my $handle, '<', $datei ) or die "open($datei,r): $!";
    while ( my $line = <$handle> ) { 
        $line =~ s/$quellwort/$zielwort/; 
        push @Zeilen, $line; 
    }
    close($handle);

    open( $handle, '>', $datei ) or die "open($datei,w): $!";
    # oder "alles auf einmal schreiben":
    # print $datei @zeilen;
    foreach ( @Zeilen ) { print $datei $_; }
    close($handle) or die "close($datei): $!";
}


Ansonsten kann man den Code noch weiter vereinfachen, indem man das bereits empfohlene Perldoc:Tie::File einsetzt.

edit: Modul-Link: s/mod/pod/g
Last edited: 2016-03-08 22:46:01 +0100 (CET)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Probleme bei File - Handler - Änderung einer Zeile