perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 35
Click for quality!




10.02.2012 / 20:32

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragHilfe: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: 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

Beitragre: Hilfe: Hab ein Problem mit Filehandle
Seitenanfang
sorry war sven gemeint :-)

Datum: 09.11.2005-10:39

Beitragre: 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

Beitragre: 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

-






-
-