2012-07-13 4 views
6

मेरे पास एक पर्ल स्क्रिप्ट है जो रेगेक्स खोज पढ़ती है और आईएनआई फ़ाइल से मूल्यों को प्रतिस्थापित करती है।पर्ल: रेगेक्स खोज पास करना और चर का उपयोग करके प्रतिस्थापित करें

यह तब तक ठीक काम करता है जब तक कि मैं कैप्चर चर ($ 1 या \ 1) का उपयोग करने का प्रयास नहीं करता। ये सचमुच $ 1 या \ 1 के साथ बदल जाते हैं।

कोई विचार मैं चर के माध्यम से regex बिट्स को पारित करने के लिए इस कैप्चर कार्यक्षमता को कैसे प्राप्त कर सकता हूं? उदाहरण कोड (एक INI फ़ाइल का उपयोग नहीं कर) ...

$test = "word1 word2 servername summary message"; 

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

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

इस में जो परिणाम ...

word1 word2 GENERIC $4 

नहीं

word1 word2 GENERIC summary message 

धन्यवाद

+0

आपका खोज पैटर्न सफल नहीं होगा, ** **: ** खोज पैटर्न के अंत में है लेकिन स्ट्रिंग में नहीं है। – tuxuday

+0

मेरे भाग पर खेद है,!: – andyml73

उत्तर

6

डबल मूल्यांकन का उपयोग करें:

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

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

s/// के अंत में $replace और ee में डबल कोट्स नोट करें।

+0

से हटा दिया जाना चाहिए था कि चाल है, – andyml73

-1

\ 4, $ 4 का उपयोग करें।

$ 4 का q() में कोई विशेष अर्थ नहीं है, और न ही आरई इंजन इसे पहचानता है।

\ 4 आरई इंजन के लिए विशेष अर्थ है।

+0

Arkadiy, जो निश्चित रूप से मदद नहीं करेगा। आपको अतिरिक्त मूल्यांकन चरण की आवश्यकता है। –

+0

ओह क्रेप - मैंने सोचा कि पर्ल परिवर्तनीय इंटरपोलेशन करता है और फिर आरई सिंटैक्स लागू करता है - मुझे लगता है कि मैं गलत था और चर के मानों को अक्षर के रूप में माना जाता है। इस पर ध्यान दिलाने के लिए धन्यवाद। – Arkadiy

0

चेतावनी दी है कि प्रतिस्थापन

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

एक और दिलचस्प समाधान का प्रयोग करेंगे लुक-Aheads (?=PATTERN)

आपका उदाहरण तो केवल क्या जगह लेंगे बाहरी फ़ाइल से आ रही है eval करने के लिए regex-उप विषय की कोशिश, बदला जाना आवश्यक:

$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

मुझे यह पसंद है, यह अधिक सुरुचिपूर्ण हो सकता है, धन्यवाद – andyml73

0

आप आमोन के समाधान चाहते हैं, तो मुझे लगता है कि "सामान्य $ 1" नहीं विन्यास है (especia इसमें '$ 1' भाग लें)। उस मामले में, मुझे लगता है कि वहाँ लुक-Aheads के उपयोग के बिना एक भी अधिक सरल उपाय: (? = पैटर्न) निश्चित रूप से के बारे में वास्तव में बुरा कुछ भी नहीं है

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

हालांकि।

संबंधित मुद्दे