Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| Hallo zusammen, ich bendake mich schon im Vorraus für die Hilfe. if(file handle exists) { close(SCRFILE); } open(SRCFILE,">xxx.txt") or die "can't open $!"; Das Problem ist .. wie kann ich nachschauen beim Filehandle, ob die Datei schon existiert, und wenn sie existiert soll er eine neue anlegen und nicht überschreiben. Danke für eure Hilfe eco77
Datum: 03.11.2005-12:49

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| Hi, ich würde einen Dateitestoperator verwenden.
my $datei_1 = "xxx.txt"; my $datei_2 = "yyy.txt";if(! -f $datei_1) { ...open(F, ">".$datei_1) || die "Konnte $datei_1 nicht anlegen. $!"; } else { ...open(F, ">".$datei_2) || die "Konnte $datei_2 nicht anlegen. $!"; }
http://de.selfhtml.org/perl/funktionen/dateiverwaltung.htm#dateitest-uw
Datum: 03.11.2005-13:40

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| Hallo, ja ich weis ja gar nicht was für eine Datei existiert... Wie muss ich das dann machen ??? Danke
Datum: 03.11.2005-15:36

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| Hi, jetzt kann ich Dir leider nicht folgen. Beschreibe mal Deine Problemmstellung etwas genauer. Um eine Prüfung durchzuführen, ob eine Datei schon existiert muss man schon wissen, wie diese heißt. -uw
Datum: 04.11.2005-10:49

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| Hallo, also das Problem ist folgendes... ich lass das perl skript laufen zb. in einer Datenbank. Das skript soll dann History öffnen, die Datei kopieren und in RHistory.. reinschreiben. Beim nächsten Durchlauf soll das Skript nochmal durchlaufen aber die existierenden Dateien nicht überschreiben und eine neue Datei anlegen. Eine Prüfung... $Pattern wollte ich nummer mitgeben das er nicht überschreibt... Deswegen open und close.. oder wie kann ich das machen .. eine Prüfung ob der filehandle bzw. datei name schon existiert wenn ja dann schließe filehandle und lege öffene ein neues filehandle und schreibe rein. Das wars.. verstanden.. Danke di´r nochmal .. und den anderen auch ... BYE open(HISTORY, "$RHistory |"); my @History = <HISTORY>; foreach(@History){ chomp; my $line = $_; if($line =~ /^\/\//) { if(file handle exists) { close(SCRFILE); } open(SRCFILE,">RHistory_$pattern.txt") or die "can't open $!"; print SCRFILE "$_\n"; my $filename = open(SRCFILE,">RHistory.txt") or die "can't open $!"; } close(HISTORY); close(SRCFILE);
Datum: 04.11.2005-16:43

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| Hi, ist das der komplette Code? Sehr undurchsichtig! HISTORY SCRFILE SRCFILE ??? Kannst Du den Quellcode mal zum Download zur Verfügung stellen, damit ich ihn mir anschauen kann? Mit einem solchen Satz: "Beim nächsten Durchlauf soll das Skript nochmal durchlaufen" kann ich ehrlich gesagt auch nicht viel anfangen. -uw
Datum: 04.11.2005-20:27

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| Hallo, hier der ganze code... open(NUMBER, " $LCNumber | ") or die "can't open $LCNumber: $!"; foreach my $line(<NUMBER>){ my $Number = (split (/\s+/,$line ))[1]; my $rw = open(SRCFILE,">ChangeList_$Number.txt"); if (not defined($rw)){ die "can't open $rw: $!\n"; } open(INFO, "$CLInfo$Number |"); my @Info = <INFO>; foreach(@Info){ print SRCFILE "$_\n"; } open(HISTORY, "$RHistory |"); my @History = <HISTORY>; foreach(@History){ chomp; my $line = $_; if($line =~ /^\/\//) { #if(file handle exists) { # close(SCRFILE); #} # open(SRCFILE,">RHistory_$pattern.txt") or die "can't open $!"; # print SCRFILE "$_\n"; #my $filename = open(SRCFILE,">RHistory.txt") or die "can't open $!"; sysopen(SRCFILE, "RHistory.txt", O_WRONLY | O_CREAT) or die "can't open >RHistory.txt: $!"; flock(SRCFILE, LOCK_EX) or die "can´t get a lock on : $!"; truncate(SRCFILE, 0); print SRCFILE "$_\n"; } } close(HISTORY); close(INFO); close(SRCFILE); } close(NUMBER); Ich will einfach die Datei nicht überschreiben und immer eine neue anlegen.... Ich hab da oben nur was versucht... BYE
Datum: 07.11.2005-10:36

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| "Ich will einfach die Datei nicht überschreiben und immer eine neue anlegen...." OK, dann teste doch einfach, ob "die Datei existiert, Du musst ja den Pfad und den Dateinamen irgendwo haben, um sie öffnen zu können, oder? Du darfst nicht auf die Existenz des FileHandles prüfen, sondern auf die Datei selbst. also sowas wie:
my $suffix = 0; while (1) { if ( -f "RHistory_$pattern.txt.$suffix") { echo "Debug: Datei existiert bereits\n"; ++$suffix; next; } else { open(SRCFILE,">RHistory_$pattern.txt.$suffix") or die "can't open $!"; ... }
Datum: 07.11.2005-11:40

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| Hallo Jens, danke nochmal :-) Aber irgendwie bin ich durcheinander... Gibt es auch etwas wo nachprüft ob das filehandle schon existiert("open(SRCFILE,">RHistory_$Number.txt");") und dann es schliest und wieder auffruft.... bzw.. ein neues anlegt.. Danke dir... BYE
Datum: 07.11.2005-13:49

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| Hi, wie schon gesagt muss eine Datei existieren und geöffnet werden können, damit überhaupt ein Filehandle erzeugt werden kann. Auch musst Du hierfür wissen wie diese Datei heist. Definition Filehandle: Es wird ein Kanal (Pipeline) erzeugt, der von einem Skript, bzw. Programm auf eine geöffnete Datei zeigt. Durch diesen Kanal können nun Daten übertragen werden. -uw
Datum: 07.11.2005-14:05

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| Hi, das FileHandle ist SRCFILE. Es ist ein handle auf eine Datei und existiert, bis Du es schliesst. Du musst schon selbst wissen, ob es noch existiert. Du kannst aber soweit ich weiss auch einen FileTest Operator auf ein Filehandle benutzen, z.B.
open(IN, $file) or die "Could not open $file: $!\"; if ( -e IN) { print "Handle 'IN' existiert und ist geöffnet\n; } else { print "Handle 'IN' existiert nicht\n; }
Ich glaube, Dein Problem ist der Unterschied zwischen dem File selbst und dem FileHandle. Gruss, svenXY
Datum: 07.11.2005-14:22

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| Hallo, bin nochmal da ... habs hinbekommmen anders.. Danke nochmal .. Aber hab ein anders Problem.... jetzt wieder mit split ... Code: my $action = (split(/\s/, $_))[2] . " " . (split(/\s/, $_))[3]; print "aaaa: $action\n"; if($action eq "delete from" || $action eq "merge from" || $action eq "copy from" || $action eq "ignored" ){ open(SRCFILE,">>ChangeList_$Number.txt") or die "can't open $!"; print SRCFILE "\tAction: $action\n"; } Ergebniss: aaaa: copy from aaaa: copy into aaaa: ignored //temp/..... aaaa: ignored by aaaa: delete into aaaa: edit from usw... Klappt auf wunderbar aber ein Problem habe ich ... ich will das Array [3] mir nicht //temp/... liefert bzw. brauch ich [3] das from, into usw. bekomme.... wie kann ich denn mit regulären Ausdrücken das //temp/... wegbekommen... oder wie kann ich es den Abfangen..das dann in diesem einzigen Fall nur ignored stehen bleibt.. Damit ich es ausgeben bzw. in die Datei schreiben kann... also das //muss weg und nur beim ignore.. taucht es auf.... Kann jemand mir bitte helfen... Bedanke mich nochmal für eure Hilfen... BYE
Datum: 08.11.2005-20:05

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
... my @action = (split(/\s/, $_))[2,3]; @action = map { s/\\\\.*$// } @action; my $action = join('', @action);
Gruss, svenXY
Datum: 09.11.2005-10:06

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| Hallo Jens, klappt leider nicht.. so .. jetzt kommt gar nichts mehr raus.. aaaa.....ist leer... Was macht überhaupt die Zeile :-) @action = map { s/\\\\.*$// } @action; gibt es eine Ausdruck das bis //tem.. alles ausgeben soll und den rest verwerfen .. Also wenn ein // soll er ab // bis zum Ende alles verwerfen und nur das vordere nehmen... Danke BYE
Datum: 09.11.2005-10:36

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| sorry war sven gemeint :-)
Datum: 09.11.2005-10:39

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
sorry, hatte \\ und // verwechselt...
... my @action = (split(/\s/, $_))[2,3]; # teile $_ und erstelle daraus ein Array @action @action = map { s|//.*$|| } @action; # gehe durch das array und ersetzte in jedem Element //undnochmehr durch nichts my $action = join('', @action); # haenge die beiden Elemente wieder aneinander
Hoffe, es ist jetzt klarer. map ist ein cooles Teil um etwas mit allen Elementen eines Arrays anzustellen (eleganter als eine foreach Schleife) Gruss, svenXY
Datum: 10.11.2005-10:49

|
re: Hilfe: Hab ein Problem mit Filehandle
|
Seitenanfang |
| Hallo, wenn es Dir nur um den Vergleich geht, dann hilft eventuell dass hier: if($action =~ /delete from|merge from|copy from|ignored/) was soviel heißt, wenn $action eine der Alternativen enthält, dann erledige etwas... Ciao Ingo
Datum: 10.11.2005-10:15

|