[Dresden-pm] Datei Lesen plus schreiben

Maik Hentsche maik at mm-double.de
So Mai 6 05:30:03 PDT 2012


Sebastian Oeste <oeste.sebastian at googlemail.com> wrote:

> 
> Hallo, 
> 
> Ich wollte ein Perl Skript schreiben mit dem ich eine bestimmte Zeile
> aus einer Datei löschen kann. 
> [..]
> Warum funktioniert das nicht ? 

Aus mehreren Gründen. Kommentare inline.

> #! /usr/bin/perl -w
> 
> use strict;
> use warnings;

use warnings und perl -w aktiviert beides Warnungen. Das use macht es
lokal, das -w global. Deshalb solltest du ersteres bevorzugen, sonst
kriegst du Warnungen, wenn du ein Modul nutzt, das nicht warning-sicher
ist.

> use feature "say";
> 
> my ($fh, $i);
> open ($fh, "+>", "test.txt") || die qq/cannot open $!/;

perl -f open sagt:
"You can put a '+' in front of the '>' or '<' to indicate that you want
both read and write access to the file; thus '+<' is almost always
preferred for read/write updates--the '+>' mode would clobber the file
first."

Der letzte Teil ist wichtig. Mit +> wird dein File erstmal kaputt
gemacht. Angenommen, das würde funktionieren, wie du willst, dann...

> my @lines = ();
> $i = 0;
> while ( <$fh> ) 
> {
>     push (@lines, $_) unless $i == 2;
>     $i ++;
> }

... wärst du hier am Ende des Files. Du müsstest den Filepointer erstmal
zurück auf den Anfang setzen.
  seek $fh, 0, 0;
ABER: Das hilft dir auch nicht, so wie du willst. Angenommen, dein File
hat 6 Zeilen. Dann würdest du nun die ersten 5 Zeilen mit Zeile
1,2,3,4,5,6 überschreiben und Zeile 6 bliebe bestehen (und wäre damit
doppelt).

> for (@lines) 
> {
>     print $fh "$_\n" ;

Damit verdoppelt du die Newline am Ende der Zeile, denn du hast die
oben mit gelesen, ohne sie zu entfernen.

> }
> 
> close ($fh); 


> Habt ihr ein Tip für mich wie das noch eleganter geht ? 

Nur lesend öffnen, dann deine Version um die Zeilen in ein Array zu
lesen. Datei nur zum Schreiben öffnen und los schreiben.

so long
Maik

-- 
Der Verstand ist wie eine Fahrkarte. Sie hat nur Sinn wenn man sie
benutzt. (Ernst R. Hauschka (*1926), deutscher Essayist,
Aphoristiker und Bibliothekar)
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : signature.asc
Dateityp    : application/pgp-signature
Dateigröße  : 190 bytes
Beschreibung: nicht verfügbar
URL         : <http://mail.pm.org/pipermail/dresden-pm/attachments/20120506/8f78a5fb/attachment.bin>


Mehr Informationen über die Mailingliste Dresden-pm