my %found; # c sagt: mache nach dem letzten match weiter (continue after last match) # Das problem ist nur das jede andere regex den counter für diese zurücksetzt # also bedarf es eine prüfung die ohne regex auskommt, # falls ein wert keine keditkartennummer ist, # damit die schleife nicht hängen bleibt while ($row =~ /(3[47]\d{13})/gc) { # Werte zwischenspeichern, Da jede regexp $1 usw. überschreibt. my $number=$1; # also wert speichern und überspringen wenn schon gefunden next if($found{$number}++); # weiter wenn es nicht passt # hier kann es passieren das die regex-engine zurück gesetzt wird # zb durch eine andere regex next unless(is_valid($number)); print "$number\n"; # nun den gefundenen wert mit dem maskierten ersetzen my $masked=$number; # achtung! das setzt die regex-engine zurück! $masked=~s/^.+(\d{4})$/XXXXXXXXXXX$1/; $row=~s/$number/$masked/g; # hiernach beginnt die regex im while wieder am anfang der zeile, # was aber unproblematisch ist, # da alle entweder die werte maskiert wurden, # oder in "%found" stehen. }