2017-05-28 2 views
-1

Ich versuche, Perl zu lernen und habe einige Probleme. Ich habe versucht, die ursprüngliche Datei zu überschreiben, aber es hat nicht funktioniert. Bitte hilf mir.Wie überschreiben Sie die Datei

#!/usr/bin/perl -w 

use diagnostics; 
use warnings; 
use strict; 

open (FILE, '>>apple.txt'); 
while (<FILE>){  
    s/is/at/; # Substitute 'is' for 'at' 
    print FILE; 
    close (FILE); 
} 

Ich habe versucht, alle is-at zu ändern und das Ergebnis in die ursprüngliche Datei zu schreiben.

Vielleicht habe ich etwas verpasst.

+0

Willkommen bei Stackoverflow. Bitte nehmen Sie die [Tour], lernen, gute Fragen zu stellen stackoverflow.com/help/how-to-ask, machen eine [MCVE]. Weitere Informationen darüber, was schief geht, wie. I.e. liefern ein aktuelles Ergebnis im Vergleich zum gewünschten Ergebnis. – Yunnosch

+1

Wahrscheinlich möchten Sie den '/ g' Modifikator. Und Sie möchten auch Ihre Datei zum Lesen öffnen. Sie haben es im Append-Schreibmodus '>>' geöffnet. Welche Art von Tutorial oder Buch verwendest du? – simbabque

+0

@simbabque Ich habe gerade ein paar Tutorials im Internet gefunden. Ich habe das Buch gelesen, aber es war mir nicht nützlich. – Darentina

Antwort

4

Wenn Sie eine beliebige Zeit in Perl programmieren möchten, sollten Sie sich die Zeit nehmen, die Perl FAQ zu lesen. Eine der in Abschnitt 4 geäußerten Fragen scheint hier nützlich zu sein.

How do I change, delete, or insert a line in a file, or append to the beginning of a file?

Die Antwort beginnt wie folgt aus:

Die Grundidee Einfügen, Ändern oder eine Zeile aus einer Text Datei zu löschen beinhaltet das Lesen und Drucken der Datei auf den Punkt, den Sie wollen machen Sie die Änderung, die Änderung vornehmen, dann lesen und drucken Sie den Rest der Datei. Perl bietet keinen wahlfreien Zugriff auf Zeilen (insbesondere , da das Datensatzeingabetrennzeichen $/ veränderbar ist), obwohl Module wie Tie::File es fälschen können.

Ein Perl-Programm, diese Aufgaben zu tun nimmt die Grundform, eine Datei zu öffnen, seine Linien gedruckt wird, dann Schließen der Datei:

open my $in, '<', $file  or die "Can't read old file: $!"; 
    open my $out, '>', "$file.new" or die "Can't write new file: $!"; 
    while(<$in>) { 
     print $out $_; 
    } 
    close $out; 

Einige Kommentare zu Ihrem aktuellen Code:

  • Sie benötigen nicht beide -w und use warnings. Die meisten Leute benutzen nur Letzteres.
  • Verwenden Sie bitte die drei-Argument-Version von open() und lexikalische Dateihandles - open my $file_handle, '>>', 'apple.txt'.
  • Sie sollten immer den Rückgabewert von open() überprüfen und entsprechende Maßnahmen ergreifen. Oft verwenden die Leute dafür die() - open my $file_handle, '>>', 'apple.txt' or die "Can't open file: $!.
0

Perl unterstützt im Allgemeinen keinen direkten Zugriff auf Dateien. Es wird bevorzugt, den geänderten Inhalt in eine temporäre Datei zu schreiben, schließen Sie Eingabe- und Ausgabedateien und benennen Sie die temporäre Datei in die Eingabe um.

Oder wenn dies das einzige, was Sie tun möchten, Sie ein Einzeiler Befehl wie verwenden:

perl -p -i -e "s/is/at/" -- apple.txt 

, die in etwa die gleiche.

Oder wenn Sie sehr viel diese Operation auf eigene Faust programmieren möchten, dann:

  • Besuch perldoc.perl.org/perlrun.html Seite,
  • Fund Beschreibung -i[extension] Option
  • nach den Wörtern entspricht Sie den entsprechenden Perl-Code finden.

Und eine Bemerkung Code betreffend:

open (FILE, '>>apple.txt'); 

öffnet die Datei mit dem aktuellen Positionszeiger am Ende der Datei, so dass jeder Druck Befehl fügt der Text, anstatt die Datei von Anfang an zu überschreiben.

0

Es ist ein Modul Tie::File namens kann die Anfrage tun sein könnte:

use Tie::File; 

my $inputFile = "test.txt"; 

my @array =(); 
tie @array, 'Tie::File', $inputFile || die "Error: Couldn't tie the \"$inputFile\" file: $!"; 
my $len = join "\n", @array; 

if($len=~m/is/) { $len=~s/is/at/g; } 

@array = split/\n/, $len; 
untie @array; 
Verwandte Themen