2017-06-02 12 views
0

Ich versuche eine Textdatei zu öffnen und zu lesen und schreibe dann den Inhalt dieser Dateizeile pro Zeile in eine HTML-Datei. Bisher habe ich mit diesem kommen:Eine Textdatei mit Perl lesen und schreiben

use strict;  
use locale; 

my (@datei, $i); 
open (FHIN,"HSS_D.txt") || die "couldn't open file $!"; 
@datei= <in>; 
close FHIN; 

open (FHOUT, ">pz2.html"); 
print FHOUT "<HTML>\n"; 
print FHOUT "<HEAD>\n"; 
print FHOUT "<TITLE>pz 2</TITLE>\n"; 
print FHOUT '<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">'; 
print FHOUT "\n</HEAD>\n"; 
print FHOUT "<BODY>\n"; 

for ($i = 0; $i < @datei; $i++) { 
    print FHOUT "<p>$datei[$i]</p>\n"; 
} 

print FHOUT "</BODY></html>\n"; 
close (FHOUT); 

Allerdings bekomme ich einen Kompilierungsfehler jedes Mal, und ich kann nicht herausfinden, was los ist. Danke für Ihre Hilfe!

+6

Geben Sie die EXACT-Fehlermeldung ein, die Sie erhalten. Dein Code kompiliert für mich. – toolic

+0

'charset = iso-8859-1'? Was ist das, 1998? – melpomene

+0

@melpomene, bitte nicht auf Zeichensätze starten, es ist ein Sumpf. Und ich sehe es lieber spezifiziert und vertraue dann blind darauf, dass es UTF-8 wäre ... welches weder als Pragma am oberen Rand angegeben ist, das die in der Perl-Datei verwendete Kodierung beschreibt, noch ist die Kodierung bei der Eingabe angegeben. vielleicht ist es tatsächlich Latin-1? – vanHoesel

Antwort

1

Problem in Ihrem Skript

Sie speichern falsche Handler in Ihrem Array, das Ihr Problem. @datei = <in> sollte

@datei = <FHIN>; 

Einige etc Dinge, die Sie wissen sollten

1) Verwenden Sie stets Warnungen setzen und auf einem oberen Rand des Programm strengen verwenden.

2) Speichern Sie nicht die ganze Datei in einem Array, sondern müssen Sie die Datei zeilenweise bearbeiten.

while (my $line = <FHIN>) 
{ 
    Do your stuff here. 

3) Verwenden Sie drei Argumente für das Dateihandle. Gleichwie

open my $fh,'<', "filename" 

4) folgen dem jedes Element aus einem Array zugreifen können Sie Perl foreach verwenden anstelle von C-Stil Looping

for my $elemnts(@arrray) 
{ 

Wenn Sie annehmen, haben eine Schleife durch seinen Index Verwendung iterieren wollen das folgende Format.

for my $index(0..$#arrray) 
{ 

Above .. bedeutet Bereichsoperator $# den letzten Indexwert

+0

Ich glaube nicht, Punkt 4 ist ein guter Vorschlag ... – NetMage

+0

@NetMage. Vielen Dank für Ihren Kommentar. Beitrag bearbeitet. – mkHun

1

geben Wenn Sie warnings über use warnings oder use warnings qw(all)aktiviert hatte, die Sie immer tun sollten — Sie so etwas wie dies gesehen hätte:

Name "main::in" used only once: possible typo at foo.pl line 6.

Das heißt, natürlich, diese Zeile:

@datei= <in>; 

Die Ursache des Problems ist, dass Sie einen Dateihandle FHIN namens geöffnet, aber man versucht, von einem Dateihandle zu lesen in benannt. Allerdings würde die ganze Operation besser mit lexikalischen Dateihandies und die Form open mit drei Argumenten geschrieben werden, was ein best practice gilt:

open(my $fh, '<', 'HSS_D.txt') or die "couldn't open file $!"; 

Als beiseite, ich habe gestimmt diese Frage als Wegthema schließen weil es sich um ein Problem handelt, das durch einen einfachen Tippfehler verursacht wurde.

Verwandte Themen