PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl Problem



villiboy
18.01.2006, 14:23
Hi Leute,
ich möchte in Perl eine Datei neu anlegen und in diese schreiben z.B. ein Adressbuch. Doch leider gibt es schon probleme beim anlegen der Datei.
Hier der Code:

#!/usr/bin/perl
sysopen(IN,"meineDatei.txt",O_CREATE) or die "Fehler beim öffnen der Datei\n$!";
while(<IN>) {
print "Jetzt möchte ich in die Datei schreiben\n";
}
close(IN)

Wäre nett, wenn mir da wer helfen könnte!!

Danke

Nachtrag: Kann es sein, wenn ich es so mache: open(DATEI,">meineDatei.txt") das es mir dann die Datei anlegt, wenn sie nicht vorhanden ist?

avaurus
18.01.2006, 14:38
open(FOO, ">myfile.txt");
print FOO "Ich schreibe in die Datei!";
close(FOO);

bling :).


Nachtrag: Kann es sein, wenn ich es so mache: open(DATEI,">meineDatei.txt") das es mir dann die Datei anlegt, wenn sie nicht vorhanden ist?
ja, wenn die Datei nicht vorhanden ist, wird sie erstellt. Ist die Datei bereits vorhanden, wird sie überschrieben.
Mit open(FOO, ">>bla.txt"); hängst du Inhalt an die Datei ran.

Xanti
18.01.2006, 14:45
Perl ist Perl -> deswegen verschoben.

villiboy
18.01.2006, 16:11
sorry, hab ich ganz verpeilt.....
aber jetzt mal was zu perl...

also ich habe folgendes programm:

#!/usr/bin/perl
open(DATEI,">>meineDatei.txt") or die "Fehler beim öffnen der Datei\n$!";
print "Bitte geben Sie den Namen, Straße, Plz und Geburtstag, getrennt durch Kommata ein:\n";
$Eingabe = <STDIN>
@AdressListe = split(/,/,$Eingabe);
for(@AdressListe){
print DATEI "@AdressListe";
}
close(DATEI)


Dieses Perl-script soll mir eine adressdatei anlegen und nach straße, name oder plz sortieren. wie mache ich das? bzw. mir gibt es einen eintrag immer mehrmals in die datei aus, woran liegt das? ich möchte immer einen eintrag nach dem anderen eingeben, hiillffeeeee!!

danke

supersucker
18.01.2006, 16:26
meine perl-erfahrungen sind schon ne weile her, aber so klappt das nicht!

1. du verwendest weder

a) use strict
b) use warnings

wenn du diese beiden pragmas verwendest wirst du 99 % deiner fehler selber finden!



for(@AdressListe){
print DATEI "@AdressListe";
}


afaik kannst du nicht direkt ein array in eine datei schreiben, wenn dann:



for $_ (@array) {
print DATEI $_;
}


und warum splittest du erst den string in ein array und dann das array wieder in einzelne string-tokens?
dann kannst du auch gleich einfach den ganzen string in die datei schreiben und halt vorher mit

s///

die kommas entfernen....

Xanti
18.01.2006, 16:27
Du schreibst für jedes Listenelement die volle Liste in die Datei. Besser ist:



#!/usr/bin/perl
open(DATEI,">>meineDatei.txt") or die "Fehler beim öffnen der Datei\n$!";
print "Bitte geben Sie den Namen, Straße, Plz und Geburtstag, getrennt durch Kommata ein:\n";
$Eingabe = <STDIN>;
@AdressListe = split(/,/,$Eingabe);
for(@AdressListe){
print DATEI $_;
}
close(DATEI)

villiboy
18.01.2006, 16:33
ok, jetzt fügt es mir noch einen eintrag, wie es auch soll hinzu! aber wie kann ich eine abfrage machen, ob noch weitere einträge vorgenommen werden möchten oder keine mehr? und dann das prog beendet?
und das mit dem sortieren klappt auch nur nach dem ersten element, kann ich nicht sagen, dass ich nach einem bestimmten element wie z.b die plz sortieren will?

danke

Xanti
18.01.2006, 16:46
Du kannst es mit einer do-while-Schleife tun, in etwa wie



...
do {
lese daten
schreibe daten
...
frage: weitermachen j/n
lese $answer
} while (test $answer=="j")
...


Bezüglich Deiner sort-Frage würde ich Dir empfehlen, Dir mal Hashs anzuschauen.

avaurus
18.01.2006, 16:47
villiboy: mmhja, hier fehlen aber alle Basics, die es gibt oder ? :)...macht aber nichts. Es gibt tonnenweise netter Perlbücher und wenn du clever bist, hast du Perl verdammt schnell "drin" :).

villiboy
18.01.2006, 16:51
ja ich bin anfänger und hab da so ein aufgabenbaltt bekommen mit dem ich anfangen soll aber wie gesagt, über jede hilfe bin ich froh!!
werde mir auch bald ein buch zulegen und bis dahin auf euere unterstützung hoffen, danke!!
ich habe schon festgestellt, dass man da sehr schell reinkommt, aber das sortieren ist immer noch ein prob!!

Wolfgang
18.01.2006, 17:30
ja ich bin anfänger und hab da so ein aufgabenbaltt bekommen mit dem ich anfangen soll aber wie gesagt, über jede hilfe bin ich froh!!
werde mir auch bald ein buch zulegen und bis dahin auf euere unterstützung hoffen, danke!!
ich habe schon festgestellt, dass man da sehr schell reinkommt, aber das sortieren ist immer noch ein prob!!

Hallo
Nein, du bist nicht auf unsere Hilfe angewiesen, denn es gibt
perldoc -f FUNKTIONSNAME
Außerdem gibt es auf http://www.perl.org/ die komplette Hilfe nebst Tuorial und FAQ zu fast jedem Thema.
Ausführlicher geht es nicht.

Gruß Wolfgang

villiboy
19.01.2006, 08:29
danke wolfgang, hab mich jetzt ein paar stunden geqäult und bin auf folgendes, fast funktionierendes programm gekommen. leider komme ich aus der schleife nicht mehr raus und dieses problem bekomme ich nicht hin.
es wäre nett, wenn ihr mir sagen könnten was ich da noch falsch mache! danke

#!/usr/bin/perl
use warnings;
do{
open(DATEI,">>meineDatei.txt") or die "Fehler beim öffnen der Datei\n$!";

print "Bitte geben Sie den Namen, Straße, Plz und Geburtstag, getrennt durch Kommata ein:\n";

$Eingabe = <STDIN>;
chomp $Eingabe;

@AdressListe = split(/,/,$Eingabe);
for(@AdressListe){
print DATEI $_;
}
print DATEI "\n";
if($Eingabe eq "fin"){last} # hiermit wollte ich die schleife beenden ...
}while($Eingabe);
close(DATEI);
print "Programm beendet, Tschuess\n";

avaurus
19.01.2006, 09:14
schau doch mal, was suprsucker für dich geschrieben hat:

a) use strict
b) use warnings
du benutzt aber nur warnings ! use strict ist viel wichtiger, da es auf schwerwiegende Dinge hinweist bzw. abbricht.
Was du da schreibst ist unter aller Sau :).

villiboy
19.01.2006, 09:20
mhh, ok. wieso ist das unter aller sau?

avaurus
19.01.2006, 09:26
schreib unter "use warnings;" noch ein "use strict;" :)...dann siehst du automatisch, dass es unter aller Sau ist :). Immer dran denken: man kann nur dazulernen, ich will dich nicht beleidigen oder so, aber "use strict;" hilft ungemein Fehler schon sehr früh zu entdecken.

Xanti
19.01.2006, 09:28
schau doch mal, was suprsucker für dich geschrieben hat:

du benutzt aber nur warnings ! use strict ist viel wichtiger, da es auf schwerwiegende Dinge hinweist bzw. abbricht.
Was du da schreibst ist unter aller Sau :).

Wahrscheinlich hagelts bei "#use strict" nur Fehlermeldungen, da ist es doch besser ohne "#use strict" ;)
Erinnert mich irgendwie an den Opa, der von seinem Virenscanner immer gewarnt wird, dass sein System befallen ist. Nachdem er den Scanner ausgeschaltet hat, gabs keine störenden Meldungen mehr, ergo kein Virus :devil:

@villiboy:

Du musst die Schleifenabbruchsbedingung mit while () abfragen. Nur sone Frage: Kennst Du eigentlich den Sinn von do-while?

villiboy
19.01.2006, 09:38
ja das habe ich auch nicht so aufgefasst, aber etwas genauere erläuterungen wären nicht schlecht *gg*:think:
so jetzt habe ich mal alle fehler ausgebesser, waren aber nicht soviele wie ich erwartet habe *lol*
danke für den guten tipp ...