2012-07-13 11 views
6

Bir INI dosyasında regex aramasını okuyan ve bir INI dosyasındaki değerleri değiştiren bir Perl betiğim var.Perl: düzenli ifadeleri kullanarak arama ve değişkenleri kullanarak değiştirme

Bu, yakalama değişkenlerini ($ 1 veya \ 1) kullanmaya çalışana kadar iyi çalışıyor. Bunlar $ 1 veya \ 1 ile tam anlamıyla değiştirilir.

Bu yakalama işlevselliğini değişkenler üzerinden geçen normal ifadeleri nasıl çalıştırabilirim? Bu sonuçlanır

$test = "word1 word2 servername summary message"; 

$search = q((\S+)\s+(summary message)); 
$replace = q(GENERIC $4); 

$test =~ s/$search/$replace/; 
print $test; 

Örnek kodu (bir ini dosyası kullanarak değil) ... ...

word1 word2 GENERIC $4 

DEĞİL

word1 word2 GENERIC summary message 

sayesinde

+0

arama modeliniz başarılı olmaz, arama deseninin sonunda **!: ** var, ancak dizede değil. – tuxuday

+0

benim üzerimde kusurlu bir hata,:: – andyml73

cevap

6

Kullanım çift değerlendirme:

$search = q((\S+)\s+(summary message)); 
$replace = '"GENERIC $1"'; 

$test =~ s/$search/$replace/ee; 

s///'un sonunda $replace ve ee çift tırnak işaretlerini not edin.

+0

kaldırılmış olmalı, tabii ki yardımcı olmayacaktır. Ek değerlendirme adımına ihtiyacınız var. – andyml73

-1

\ 4 değil, 4 $ kullanın.

$ 4, q() 'de özel bir anlamı yoktur ve RE motor bunu tanımaz.

\ 4 RE motoruna özel bir anlam ifade eder.

+0

Arkadiy, hile yapan örnek –

+0

Oh crep - Perl'in değişken enterpolasyon yaptığını ve daha sonra RE sözdizimini uyguladığını sanıyordum - Sanırım yanılmışım ve değişkenlerin değerleri değişmez olarak kabul ediliyor. İşaret ettiğin için teşekkürler. – Arkadiy

0

yedek

eval "$test =~ s/$search/$replace/"; 
0

başka ilginç çözüm (?=PATTERN)

Sizin örnek daha sonra sadece ne yerini alacak göz-aheads kullanacağı dış dosyadan geldiğini uyarılmalıdır, eval için normal ifade-sub tabi deneyin değiştirilmesi gereken: Eğer Amon'un çözüm isterseniz

$test = "word1 word2 servername summary message"; 

# repl. only ↓THIS↓ 
$search = qr/\S+\s+(?=summary message)/; 
$replace = q(GENERIC); 

$test =~ s/$search/$replace/; 
print $test; 
+0

Beğendim, bu daha zarif olabilir, teşekkürler – andyml73

0

, ben "GENERIC $ 1" yapılandırma olmadığını varsayalım (especia içeride '$ 1' kısmı). Bu durumda, ben göz-aheads kullanmadan daha da basit bir çözüm olduğunu düşünüyorum: (? = KALIP) hakkında gerçekten kötü bir şey tabii orada

$test = "word1 word2 servername summary message"; 
$search = qr/\S+\s+(summary message)/; 
$replace = 'GENERIC'; 
$test =~ s/$search/$replace $1/; 

rağmen.

İlgili konular