Variable in Regex-Modifier?

10/04/2009 - 18:02 von Ferry Bolhar | Report spam
Hallo,

ich habe einen Fall, in dem ein String je nach Zustand eines Flags
case-sensitive
oder case-insensitive gematcht werden soll.

Gutglàubig, wie ich nun mal bin, dachte ich, ich könne das z.B.

my $mod = $flg ? 'oi' : 'o';
if ($string =~ /$patt/$mod) ...

schreiben. Da bekomme ich aber vom Parser eins aufs Dach:

Scalar found where operator expected at test.pl, line 12, near "/$patt/$mod"

Scheinbar werden Modifier in Regexes nicht interpoliert, daher dürfen sie
nur als Literal angegeben werden.

Natürlich könnte ich das Ganze auch als if-then-else-Konstrukt schreiben,
aber das erscheint mir irgendwie unelegant. Hat jemand eine bessere Idee?

Grüße aus Wien,

Ferry
 

Lesen sie die antworten

#1 Tim Landscheidt
10/04/2009 - 18:38 | Warnen spam
"Ferry Bolhar" wrote:

[...]
Natürlich könnte ich das Ganze auch als if-then-else-Konstrukt schreiben,
aber das erscheint mir irgendwie unelegant. Hat jemand eine bessere Idee?



man perlre, "Extended Patterns":

| [...]
| "(?pimsx-imsx)"
| One or more embedded pattern-match modifi-
| ers, to be turned on (or turned off, if
| preceded by "-") for the remainder of the
| pattern or the remainder of the enclosing
| pattern group (if any). This is particular-
| ly useful for dynamic patterns, such as
| those read in from a configuration file,
| taken from an argument, or specified in a
| table somewhere. Consider the case where
| some patterns want to be case sensitive and
| some do not: The case insensitive ones
| merely need to include "(?i)" at the front
| of the pattern. For example:

| $pattern = "foobar";
| if ( /$pattern/i ) { }

| # more flexible:

| $pattern = "(?i)foobar";
| if ( /$pattern/ ) { }

| These modifiers are restored at the end of
| the enclosing group. For example,

| ( (?i) blah ) \s+ \1

| will match "blah" in any case, some spaces,
| and an exact (including the case!) repeti-
| tion of the previous word, assuming the
| "/x" modifier, and no "/i" modifier outside
| this group.

| Note that the "p" modifier is special in
| that it can only be enabled, not disabled,
| and that its presence anywhere in a pattern
| has a global effect. Thus "(?-p)" and
| "(?-p:...)" are meaningless and will warn
| when executed under "use warnings".

Tim

Ähnliche fragen