Hallo Bautz!
Lass mich erstmal Deinen Schreibstil anmeckern, ja? ;)
Bei kurzen Anweisungen kann man einen Block sicher in einer Zeile schreiben:
if (...) { tuwas(); }
Wenn du aber einrückst, dann bitte der schließenden Klammer des Blocks auch eine eigene Zeile gönnen:
if (....) {
$regel = ".[°^!\"§\$%&\/()[\]{}=?\\`´*+~'#<>;,:._-]."
}
Ich habe zunächst gedacht, diese letzte »}« gehört noch zum RegExp! Ein Semikolon ist nicht notwendig, wenn ein Block eine einzige Anweisung enthält, ich setzte jedoch immer einen, denn vielleicht will ich später das Programm überarbeiten und weitere Anweisungen hinzufügen?
if (....) {
$regel = ".[°^!\"§\$%&\/()[\]{}=?\\`´*+~'#<>;,:._-].";
}
So, nun zum RegExp-Problem. Zunächst fehlt in Deinem else-Zweig die schließende Klammer »]« der Klasse:
else {
$regel = ".[°^!\"§\$%&\/()[\]{}=?\\`´*+~'."
}
Ferner hat Perl wunderbare Operatoren, siehe perldoc perlop:
--------------------
Quote and Quote-like Operators
While we usually think of quotes as literal values, in Perl they
function as operators, providing various kinds of interpolating and
pattern matching capabilities. Perl provides customary quote characters
for these behaviors, but also provides a way for you to choose your
quote character for any of them. In the following table, a "{}"
represents any pair of delimiters you choose.
Customary Generic Meaning Interpolates
'' q{} Literal no
"" qq{} Literal yes
`` qx{} Command yes*
qw{} Word list no
// m{} Pattern match yes*
qr{} Pattern yes*
s{}{} Substitution yes*
tr{}{} Transliteration no (but see below)
<<EOF here-doc yes*
* unless the delimiter is ''.
--------------------
In diesem Fall bietet sich qr (steht für quoted RegExp) an:
$regel = qr/pattern/;
Immer drauf achten, dass gewählte Delimiter maskiert werden, falls sie im Pattern vorkommen!
Viele Grüße aus Frankfurt/Main,
Patrick