Thread rekursives Suche Tauschen und speichern in gleiche datei (6 answers)
Opened by heralkey at 2011-11-20 22:18

topeg
 2011-11-23 12:19
#154433 #154433
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ich bin immer wieder verwundert was Leute von perl erwarten.
Woher soll Perl wissen was in $line stehen soll?
Was erwartest du dir von der Konstruktion open(...) {?
Wo wird der geänderte Inhalt der Datei gespeichert?

Es reicht nicht einfach Codebrocken zu einem Klumpen zusammen zu pappen.

Nun einmal als "straigt vorward" Perl:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/perl
use strict;
use warnings;

# verzeichnis in dem gearbeitet werden soll
my $base_dir='./ligen/*.txt';


# alle Dateien im Verzeichnis durchgehen
# öffnen und einlesen
# Inhalt ändern und in temporäre Datei speichern
# Original löschen und durch die temporäre Datei ersetzen
for my $filename (glob($base_dir))
{
  if(open(my $in_fh, '<', $filename))
  {

    # erzeuge Temporären Dateinamen
    my $temp_filename=$filename;
    my $cnt=0;
    while(-f $temp_filename)
    {
      $temp_filename=$filename.'.'.$cnt.'.tmp';
      $cnt++;
    }

    # öffne temporäre Datei zum schreiben
    if(open(my $out_fh,'>',$temp_filename))
    {
      # Zeile in "$line" einlesen
      while (my $line=<$in_fh>)
      {
        # Inhalt von "$line" ändern
        $line =~ s/(\w+)liga(.+)/<table id="tabelle"><p class="P_liga">$1liga$2<\/p>/g;
        $line =~ s/^(\w.+)/<tr><td class="mannschaft">$1<\/td><td class="tore1">:<\/td><\/tr>/g;

        # alles in Temoräre Datei schreiben
        print $out_fh $line;
      }
      close($out_fh);
    }
    else
    { warn "ERROR: open $temp_filename ($!)\n"; }
    close($in_fh);

    # Wenn temporäre Datei vorhanden
    # dann original löschen
    # und temporäre Datei umbenennen
    if(-f $temp_filename)
    {
      if(unlink($filename))
      {
        unless(rename($temp_filename,$filename))
        { warn("ERROR rename $temp_filename to $filename ($!)\n"); }
      }
      else
      { warn("ERROR delete $filename ($!)\n"); }
    }
  }
  else
  { warn "ERROR: open $filename ($!)\n"; }
}


Mit CPAN:Tie::File
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
28
#!/usr/bin/perl
use strict;
use warnings;
use Tie::File;

# verzeichnis in dem gearbeitet werden soll
my $base_dir='./ligen/*.txt';


# alle Dateien im Verzeichnis durchgehen
for my $filename (glob($base_dir))
{
  # Tie bindet Funktionalitäten an eine Variable
  # in diesem Fall wird das lesen/schreiben einer Datei
  # auf das ändern eines Arrays abgebildet
  my @file_array;
  if( tie(@file_array, 'Tie::File', filename) )
  {
    for my $line (@file_array)
    {
      # Inhalt von "$line" ändern
      $line =~ s/(\w+)liga(.+)/<table id="tabelle"><p class="P_liga">$1liga$2<\/p>/g;
      $line =~ s/^(\w.+)/<tr><td class="mannschaft">$1<\/td><td class="tore1">:<\/td><\/tr>/g;
    }
  }
  else
  { warn("ERROR TIE filename ($!)\n"); }
}

View full thread rekursives Suche Tauschen und speichern in gleiche datei