2013-02-23 14 views
17

Chciałbym użyć zmiennej jako wzorzec regex pasującymi nazwami:Zastosowanie zmienna jak RegEx wzór

my $file = "test~"; 
my $regex1 = '^.+\Q~\E$'; 
my $regex2 = '^.+\\Q~\\E$'; 
print int($file =~ m/$regex1/)."\n"; 
print int($file =~ m/$regex2/)."\n"; 
print int($file =~ m/^.+\Q~\E$/)."\n"; 

Wynik (lub na ideone.com):

0 
0 
1 

Może ktoś wyjaśnić jak mogę używać zmiennej jako wzorca RegEx?

Odpowiedz

8

Nie można użyć numeru \Q w łańcuchu z pojedynczym cudzysłowem/bez interpolacji. Lektor musi to zobaczyć.

W każdym razie tylda nie jest meta-znakiem.

Dodaj use regex "debug", a zobaczysz, co się naprawdę dzieje.

+0

Dzięki, używam '$ regex = ~ s/\\ Q (. *?) \\ E/quotemeta ($ 1)/ge;' do zamiany \ Q .. \ E. Czy jest jakiś inny sposób? – Ted

+1

@ user72757 Tak, nie umieszczaj najpierw '\ Q'' \ E' w swoich ciągach. – melpomene

+2

Dziwne, pytano o RegEx jako zmienną, ale wygląda na to, że dyskusja została przeniesiona do '\ Q' i' \ E':/ – ArtM

48

Jak documentation mówi:

$re = qr/$pattern/; 
    $string =~ /foo${re}bar/; # can be interpolated in other patterns 
    $string =~ $re; # or used standalone 
    $string =~ /$re/; # or this way 

więc użyć operatora qr cytat-podobnego.

+0

Dokładnie tego szukałem! Otrzymasz nagrodę w wysokości 150 punktów. – GlassGhost

+0

@GlassGhost - Czy otworzyłeś nagrodę, zanim ją przeczytałeś lub po niej? Czy musisz czekać, aż wygasa, aby dać punkty? W każdym razie 'qr //' tworzy obiekt regex, ale musisz uważać na to, co go dodajesz. Jeśli jest to literał, musisz najpierw uruchomić quotemeta(). – sln

+0

@sln musisz czekać 24 godziny, aby wydać nagrodę. – GlassGhost