Jörk Behrends: nested *?+ in regexp

Beitrag lesen

$string =~ s/$replace/ /g;

Könnten die Sonderzeichen zu dieser Fehlermeldung führen, wenn sie in $replace enthalten sind?

Ja, natürlich.
Du mußt also zunächst einmal Deinen Werte in "$replace" entsprechend escapen. Das machst Du dann am besten ebenfalls mit einem regulären Ausdruck.

Aus dem Archiv-Suchskript dieses Servers:

# --------------------------------------------------------
  # Sollen Metazeichen entwertet werden?
  if (! $FORM {'meta'})
     {
       # ---------------------------------------------------
       # Meta-Zeichen in ihre "entwerteten" Aequivalente verwandeln
       # ---------------------------------------------------
       # "" muss als erstes Zeichen ersetzt werden ...
       $string =~ s/\/\\/g;                   # "" -> "\"
       # ---------------------------------------------------
       # ... der Rest geht tatsaechlich parallel
       $string =~ s/([.^$()[/]{}*+?])/\$1/g; # "^" -> "^"
       # (manchmal ist Perl wirklich *gnadenlos* kryptisch)
       # ---------------------------------------------------
     }

Warum einfach, wenns auch kompliziert geht ;-)
$replacenew = quotemeta( $replace );

alternative kann man auch in der RegExp angeben, das der folgende Stringteil gequotet werden soll:
$string =~ s/\Q$replace\E/ /g;

Jörk