2011-02-05 29 views
10

s///g regex değişkenini (çok fazla şans olmadan) depolamaya çalışıyorum.Bir değiştirge regex'i (arama/değiştir), qr'ye benzer olarak nasıl değiştirilir //

İşte yapmak istediğimi göstermek için normal bir eşleşme kullanan bir örnek.

my %file_structure = (
    header => qr/just another/, 
    table => qr/perl beginner/, 
) 

Şimdi bu kullanarak $line =~ $file_structure{'header'} çağırabilir ve desen eşleşirse o undef veya true dönecektir.

Bununla birlikte,'un s/beginner/hacker/g gibi bir öğeyi içerdiği $line =~ $file_structure{'foo'} demek istiyorum.

cevap

10

ayrı ayrı 2 parça saklamak olmalıdır: "eval expr" bir kötülük başvurmadan çok daha güvenli olacaktır

my %file_structure = (
    foo => {pat => qr/beginner/, repl => 'hacker'}, 
); 

my $line = 'just another perl beginner'; 
$line =~ s/$file_structure{foo}{pat}/$file_structure{foo}{repl}/; 
print "$line\n"; 

:

Bulduğunuz gibi
my %file_structure = (
    foo => 's/beginner/hacker/', 
); 

my $line = 'just another perl beginner'; 
eval "\$line =~ $file_structure{foo}"; 
print "$line\n"; 
+0

istisnadır: Bunu yapmanın bir başka yolu bir altprogramda ikame saklamaktır '/ x' veya'/ı' yapabilir. Her seferinde aynı yerdeğiştirme bayraklarını kullanmanız veya yapamadığınızda bir çalışma zamanı dizgesi "eval" kullanmanız gerekir. – tchrist

+0

Bu yöntemi kullanmak istiyorsanız, http://stackoverflow.com/questions/392643/how-to-use-a-variable-in-the-replacement-side-of-the-perl-substitution-operator kullanmalısınız Sağ tarafta yakalanan bir ifade içerir. Daha güvenli, her neyse, ve daha genel – jjmerelo

9

, hiçbir şekilde bir eşleşme normal ifadesini (qr// ile eşleşme gibi) doğrudan depolamak için. Parçaları parçalayabilir ve tadmc şovları olarak yeniden birleştirebilirsiniz. olduğu gibi LHS'deki temsil edilemiyor, çünkü bir yerde `/ e` veya`/g` gibi bayrakları temsil etmek gerekirse

my %file_structure = (
    foo_uses_default => sub {s/foo/bar/}, 
    foo_takes_arg => sub {$_[0] =~ s/foo/bar/}, 
    foo_does_either => sub {(@_ ? $_[0] : $_) =~ s/foo/bar/}, 
); 

$file_structure{foo_uses_default}() for ...; 
$file_structure{foo_uses_arg}($_) for ...; 
+2

Ayrıca, $ file_structure {foo_whatever}, ... 'eşlemini de yapabileceksiniz, ve bu üç versiyondan herhangi birinin, bu durumda bir ifadenin geçmesi için uygun olabileceğine inanıyorum. –

İlgili konular