use strict;
use warnings;
use Getopt::Std;

my (%change, $file, $line, @lines, $in, $out);

use vars qw($opt_v $opt_f);

# Optionen lesen
getopts('vf:');

# Ersetzungsliste einlesen
die "Keine Ersetzungsliste angegeben\n" unless (defined($opt_f));
open(DAT, '<', $opt_f) || die("$opt_f: $!\n");
print "Ersetzungen aus $opt_f lesen\n" if ($opt_v);
while ($line = <DAT>)
  {
  chomp($line);
  unless ($line =~ m/:/)
    {
    printf STDERR "Fehler '$in' : '$out' in $opt_f Zeile $.\n";
    next;
    }
  my ($in, $out) = split(/:/,$line);
  # Falls Ersetzung durch nichts (Zeile endet nach dem ':')
  $out = '' unless(defined($out));
  $change{$in} = $out;
  }
close(DAT);

# alle Dateien bearbeiten
foreach $file (@ARGV)
  {
  # Was nicht Datei ist, ueberspringen (meist bei * im Parameter)
  if (!-f $file)
    {
    print "Ueberspringe $file\n" if ($opt_v);
    next;
    }

  # Eingabedatei komplett einlesen
  open(FILE, '<', $file) || die("$file: $!\n");
  @lines = <FILE>;
  close(FILE);

  # Originaldatei aufheben
  rename($file, $file . '.bak');

  # Datei zum Schreiben oeffnen
  open(FILE, '>', $file) || die("$file: $!\n");
  # in allen Zeilen alle Ersetzungen durchfuehren
  for $line (@lines)
    {
    for $in (keys(%change))
      {
      if ($line =~ m/$in/)
        { $line =~ s/$in/$change{$in}/g; }
      }
    print FILE $line;
    }
  close(FILE);
  print "Datei $file geaendert\n" if ($opt_v);
  }

