Die Schleife kann schon mal weg:
$string =~ s/$find/$subs/;
$output = $string;
Wenn der Benutzer auch noch Flags z.B. fuer "ignore case" angeben soll, dann kann man, wie pKai schon beschrieben hat, das in die Such-Regex aufnehmen:
my $schalter = '';
$schalter .= 'i' if $cgi->param('schalter_grossklein');
$schalter .= 's' if $cgi->param('schalter_punkt_matcht_newline');
if ($schalter) {
$find = "(?$schalter)" . $find;
}
$string =~ s/$find/$subs/;
Das gilt aber nur fuer /i, /s, /m und /x. Uebrig bleiben die Modifier /g (fuer globales Suchen/Ersetzen), /o (Suche optimieren) und /x (Whitespace und Kommentare erlauben). Es macht eigentlich nur fuer /g Sinn, variabel zu sein, aber dann wuerde ich statt des eval (gefaehrlich mit Benutzereingaben! ) einfach eine Fallunterscheidung machen:
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
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
# neues CGI-Objekt anlegen
my $cgi = new CGI;
# Formulardaten einlesen
my $find = $cgi->param('such');
my $subs = $cgi->param('ersetz');
my $string = $cgi->param('eingabe');
# Schalter aus Formular auswerten
my $schalter = '';
$schalter .= 'i' if $cgi->param('schalter_grossklein');
$schalter .= 's' if $cgi->param('schalter_punkt_matcht_newline');
# Wenn einer der Schalter gesetzt ist, vor Regexp setzen
if ($schalter) {
$find = "(?$schalter)" . $find;
}
# Wenn schalter_global, dann mit /g
if ($cgi->param('schalter_global')) {
$string =~ s/$find/$subs/g;
} else {
$string =~ s/$find/$subs/;
}
# Loesungsseite ausgeben
print $cgi->header, $cgi->start_html,
$cgi->h1("Lösung"), $cgi->p($string),
$cgi->end_html;
# ENDE