JAPH: verschiedene Fragen zu Funktionen

Beitrag lesen

Ich bin eigentlich immer davon ausgegangen, dass:
use strict
allein schon verhindert dass Eingaben nicht nachträglich interpretiert werden

Wer hat dir denn diesen Floh ins Ohr gesetzt? :)
strict macht folgendes: http://perldoc.com/perl5.8.4/lib/strict.html

Wie meine ich das

ohne use strict

Sinput = "wort1|wort2" ;
$finde =~ /$input/;
findet "wort1" oder "wort2"

mit use strict

Sinput = "wort1|wort2" ;
$finde =~ /$input/;
findet "wort1|wort2" , maskiert also die Pipe in der Eingabe

Das ist Murks. Ich habe mal einen Testcase gebaut:

use strict;
my $muster     = 'wort1|wort2';
my $vergleich1 = 'abcwort1xyz';
my $vergleich2 = 'abcwort2xyz';
my $vergleich3 = 'abcwort1|wort2xyz';
print "true1\n" if $vergleich1 =~ /$muster/; # ist wahr
print "true2\n" if $vergleich2 =~ /$muster/; # ist auch wahr
print "true3\n" if $vergleich3 =~ /$muster/; # dito

Dieser verhält sich mit oder ohne strict identisch. Ich glaube, was du suchst, ist quotemeta.

use strict;
my $muster     = 'Guten Tag.';
my $vergleich1 = 'abcGuten Tag0xyz';
my $vergleich2 = 'abcGuten Tag.xyz';
print "true1\n" if $vergleich1 =~ /$muster/; # ist wahr
print "true2\n" if $vergleich2 =~ /$muster/; # ist auch wahr

my $musterquoted = quotemeta $muster;
print "true1\n" if $vergleich1 =~ /$musterquoted/; # ist falsch!
print "true2\n" if $vergleich2 =~ /$musterquoted/; # wahr

print "true1\n" if $vergleich1 =~ /\Q$muster\E/; # ist falsch!
print "true2\n" if $vergleich2 =~ /\Q$muster\E/; # wahr

Erläuterung: Im ersten Abschnitt trifft die Übereinstimmung auf beide Strings zu, denn der Punkt am Ende wird als reguläres Zeichen gewertet. Im zweiten und dritten Abschnitt trifft die Übereinstimmung nur noch auf String 2 zu, denn der Punkt wird als literales Zeichen, d.h. als tatsächlicher Punkt, gewertet. Quotemeta tut Backslashes vor reguläre Zeichen und raubt ihnen damit ihren Sonderstatus.