Schrift
[thread]12416[/thread]

Datei einlesen -> bearbeiten -> speichern

Leser: 3


<< >> 10 Einträge, 1 Seite
tsy
 2008-08-29 12:49
#114065 #114065
User since
2008-03-17
54 Artikel
BenutzerIn
[default_avatar]
Hallo!
Ich habe gerade ein Problem mit dem Schreiben in Datein. Folgendes Skript
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use File::Find;
use strict;
use warnings;

my $dir = "path";

find(\&process, $dir);

sub process {
        my $file = $_;
        my @newFile;

        open (FILE, "<$file");
        while (my $line = <FILE>){
                if ( $line =~ s/(print)\s*("\w+")/\$lang->$1($2, \$actUser->{'lang'})/g ){
                        print "\nFound: $1, $2\n";
                }
                push @newFile, $line;
        }
        close FILE;
        open (FILE, ">$file");
        foreach my $line (@newFile){
                #print FILE $line;
                print $line;
        }
        close FILE;
}

Soll alle Dateien durchsuchen und wenn ein print gefunden wurde dieses ersetzen. Klappt soweit auch ganz gut, nur das Schreiben misslingt. Wenn ich eine Datei öffne, nachdem das Skript durchgelaufen ist, dann sind alle Zeilen ersetzt, aber danach wird die gesamte Datei noch mal unvollständig darunter geschrieben; am Anfang jeder Zeile fehlen ein paar Buchstaben.
Ausserdem bekomme ich die Warnung
Code: (dl )
readline() on closed filehandle FILE at  line 25.
also in der Zeile nach open FILE ..., die ich nicht verstehe. Kann mir jemand weiter helfen?

Gruß, tsy
LanX-
 2008-08-29 12:58
#114066 #114066
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
tsy+2008-08-29 10:49:57--
Code (perl): (dl )
1
2
3
4
sub process {
        my $file = $_;
...
}


ist das wirklich beabsichtigt ?
havi
 2008-08-29 13:04
#114067 #114067
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
du liest das file "." ein...
havi
 2008-08-29 13:15
#114069 #114069
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
sub process {
        opendir(DIR, $dir) or die $!;
        (my $file) = grep { $_ !~ m/^\.{1,2}$/ } readdir(DIR);
        closedir(DIR) or die $!;

        my @newFile;

        open (FILE, "<$file") or die $!;
        while (my $line = <FILE>){
                if ( $line =~ s/(print)\s*("\w+")/\$lang->$1($2, \$actUser->{'lang'})/g ){
                        print "\nFound: $1, $2\n";
                }
                push @newFile, $line;
        }
        close FILE;
        open (FILE, ">$file");
        foreach my $line (@newFile){
                print FILE $line;
                #print $line;
        }
        close FILE;
}
renee
 2008-08-29 13:20
#114070 #114070
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
LanX-+2008-08-29 10:58:34--
tsy+2008-08-29 10:49:57--
Code (perl): (dl )
1
2
3
4
sub process {
        my $file = $_;
...
}


ist das wirklich beabsichtigt ?


Warum nicht? File::Find setzt $_, so dass dort der Dateiname drinsteht. Man sollte nur noch auf Verzeichnis oder Datei prüfen (-d / -f)...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2008-08-29 13:21
#114071 #114071
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@havi: Wenn Du das im Kontext des OP (mit File::Find) laufen lässt, wird für jeden Eintrag im Verzeichnisbaum die erste Datei von $dir genommen.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
havi
 2008-08-29 13:32
#114072 #114072
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
renee+2008-08-29 11:21:35--
@havi: Wenn Du das im Kontext des OP (mit File::Find) laufen lässt, wird für jeden Eintrag im Verzeichnisbaum die erste Datei von $dir genommen.


Wollte nur zeigen wie er . und .. umgeht...

So wuerds funktionieren...

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sub process {
   opendir(DIR, $dir) or die $!;
   my @file = grep { $_ !~ m/^\.{1,2}$/ } readdir(DIR);
   closedir(DIR);

   my @newFile;

   for (my $i = 0; $i <= $#file; $i++) {
      open (FILE, "<$file[$i]") or die $!;
      while (my $line = <FILE>){
         if ( $line =~ s/(print)\s*("\w+")/\$lang->$1($2, \$actUser->{'lang'})/g ){
            print "\nFound: $1, $2\n";
         }
         push @newFile, $line;
      }
      close FILE;
      open (FILE, ">$file[$i]");
      foreach my $line (@newFile){
         print FILE $line;
         #print $line;
      }
      close FILE;
   }
}
LanX-
 2008-08-29 14:02
#114074 #114074
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
renee+2008-08-29 11:20:24--
Warum nicht? File::Find setzt $_, so dass dort der Dateiname drinsteht. Man sollte nur noch auf Verzeichnis oder Datei prüfen (-d / -f)...


war nur ne Vermutung, sieht seltsam aus.
Dubu
 2008-08-29 14:36
#114076 #114076
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Das Skript des OP sieht für mich soweit okay aus (außer, dass das relevante print auskommentiert ist, aber das wahrscheinlich zum Testen), und ich kann nicht nachvollziehen, woher das Problem kommt.

Davon abgesehen würde ich selber ein lexikalisches Filehandle bevorzugen und die 3-Parameter-Form von open() wählen, also open FILE, "<$file" ... durch open my $file_h, '<', $file ... etc. ersetzen. Ich glaube aber nicht, dass das Problem dadurch verursacht ist. Es wäre problematisch, wenn die process()-Funktion rekursiv oder nebenläufig aufgerufen würde, weil dann FILE mehrfach verwendet würde.
renee
 2008-08-29 14:53
#114079 #114079
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was ich noch ändern würde:

* $File::Find::name statt $_ verwenden
* Fehlerbehandlung beim "open"
* Überprüfung, ob Datei oder Verzeichnis
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 10 Einträge, 1 Seite



View all threads created 2008-08-29 12:49.