Thread Suchen / Ersetzen (25 answers)
Opened by NewtonZ4 at 2010-09-18 19:15

topeg
 2010-09-20 01:00
#141409 #141409
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Du sagst mir die Fehlermeldungen und Warnungen nicht.

Überlege dir was du nur einmal zu machen brauchst.
Da wäre das Laden der Namensliste und das Erstellen des regulären Ausdrucks.

Wie willst du die XML-Datei umbenennen?
meine Vorstellung dazu wäre:
xyz.xml -> xyz.old.xml
foo.xml -> foo.old.xml
bar.xml -> bar.old.xml

Was willst du mit dem readdir(DIR) dazwischen? Du ließt eine Datei Zeilenweise und nicht aus einem Ordner.

Du benutzt rename schau mal in die perldoc perldoc -f rename um die Beschränkungen zu erkennen.

Du verwendest $pfh später gar nicht mehr.

Benutze immer das open mit drei Parametern, das beugt möglichen Fehler vor.

Einrücken hilft bei der Übersicht, gewöhne es dir von direkt an, und halte dich konsequent daran, das macht das spätere lesen und finden von Fehlern einfacher.
Ich mache das auch nicht weil ich Leerzeichen so Liebe. :-)



Also meine Interpretation deines Codes, ungetestet:
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
63
64
#!/usr/bin/perl
use strict;
use warnings;

my $path_file='C:\Users\User0815\Desktop\Steinhaus\Perl\path.txt';
my $name_file='C:\Users\User0815\Desktop\Steinhaus\Perl\names.txt';

# einlesen der Namenspaare
my %replace;
open(my $nfh, '<', $name_file) or die "Fehler beim öffnen $name_file $!\n";
while(my $line=<$nfh>)
{
  chomp($line);
  $replace{$1}=$2 if($line=~/^\s*(.+?)\s*=>\s*(.+?)\s*$/);
}
close($nfh);

# erstellen der Suchliste
my $search_str=join('|', map{qr(\Q$_\E)}keys(%replace));
$search_str=qr!($search_str)!;

# einlesen der Dateipfade
open(my $pfh, '<', $path_file) or die "Fehler beim öffnen $path_file $!\n";
while(my $file=<$pfh>)
{
  # Zeilenumbruch am Ende entfernen
  chomp($file);

  # überspringe alle Dateien, die nicht mit ".xml" enden
  next unless($file =~ /\.xml$/);

  # Namen für die alte Datei erzeugen
  (my $old_file=$file)=~s/\.([^.]+)$/.old.$1/;

  # nach schauen, ob es die Datei "$old_file" schon gibt.
  if(-f $old_file)
  {
    # Warnung ausgeben
    warn("Datei $old_file existiert, sie wird gelöscht!\n");
    # Datei löschen
    unlink($old_file) or die("konnte $old_file nicht löschen!\n");
  }

  #Datei umbenennen:
  rename($file, $old_file) or die("Fehler beim Umbenennen von $file nach $old_file $!\n");

  # daten Datei öffnen
  open(my $dfh, '<', $old_file) or die("Fehler beim öffnen $old_file $!\n");
  # Ausgabedatei öffnen
  open(my $ofh, '>', $file) or die("Fehler beim öffnen $file $!\n");
  while(<$dfh>)
  {
     # Zeile durchsuchen und und Ersetzen
     $_=~s/$search_str/$replace{$1}/g;
     # Zeile ausgeben
     print $ofh $_;
  }
  close($ofh);
  close($dfh);
}
close($pfh);

# fertig Meldung
print "Fertig.\n";

View full thread Suchen / Ersetzen