2009-02-09 13 views
7

में नियमित अभिव्यक्तियों का डबल इंटरपोलेशन मेरे पास एक पर्ल प्रोग्राम है जो कॉन्फ़िगरेशन फ़ाइलों में नियमित अभिव्यक्तियों को संग्रहीत करता है। वे के रूप में कर रहे हैं:पर्ल

regex = ^/d+$ 

कहीं और, regex फ़ाइल से पार्स और एक चर में संग्रहीत हो जाता है - $regex। फिर मैं regex की जांच करते समय चर का उपयोग करता हूं, उदा।

$lValid = ($valuetocheck =~ /$regex/); 

मैं कॉन्फ़िगरेशन फ़ाइल में perl चर शामिल करने में सक्षम होना चाहता हूं, उदा।

regex = ^\d+$stored_regex$ 

लेकिन मैं यह नहीं कर सकता कि इसे कैसे किया जाए।

जब नियमित अभिव्यक्ति पर्ल द्वारा पार्स की जाती है तो उन्हें दो बार व्याख्या की जाती है। पहले चर का विस्तार किया जाता है, और फिर नियमित अभिव्यक्ति स्वयं को पार्स किया जाता है।

मुझे जो चाहिए वह तीन चरण की प्रक्रिया है: पहले इंटरपोलेट $regex, फिर इसमें मौजूद चरों को अलग करें और फिर परिणामी नियमित अभिव्यक्ति को पार्स करें। पहले दो इंटरपोलेशंस दोनों को "नियमित अभिव्यक्ति जागरूक" होना चाहिए। जैसे उन्हें पता होना चाहिए कि स्ट्रिंग में $ एक एंकर आदि के रूप में है ...

कोई विचार?

उत्तर

3

eval का उपयोग करके आप यहां सहायता कर सकते हैं। निम्नलिखित कोड पर एक नजर डालें यह एक regexp कि बाद में इस्तेमाल किया जा करने के लिए तैयार है precompile कर सकते हैं:

my $compiled_regexp; 
my $regexp = '^\d+$stored_regexp$'; 
my $stored_regexp = 'a'; 

eval "\$compiled_regexp = qr/$regexp/;"; 
print "$compiled_regexp\n"; 

ऑपरेटर qr // एक regexp precompile करने के लिए इस्तेमाल किया जा सकता। यह आपको इसे बनाने देता है लेकिन इसे अभी तक निष्पादित नहीं करता है। आप पहले इसके साथ अपने regexps बना सकते हैं और फिर बाद में उनका उपयोग करें।

3

आपकी पर्ल चर आपकी कॉन्फ़िगरेशन फ़ाइल के दायरे में नहीं हैं, और मुझे लगता है कि यह एक अच्छी बात है। eval डरावना है।

आप अपने स्वयं के टेम्पलेटिंग को लागू करने से बेहतर होंगे।

regex = ^\d+__TEMPLATE_FIELD__$ 

कॉन्फ़िग फ़ाइल पाठक में:

कॉन्फ़िग फ़ाइल में

तो

# something like this for every template field you need 
$regex =~ s/__TEMPLATE_FIELD__/$stored_regex/g; 

का उपयोग करते समय:

$lValid = ($valuetocheck =~ m/$regex/) 

ले जाएँ इन चारों ओर किस बिंदु पर आप चाहें पर निर्भर करता है आवेदन करने के लिए टेम्पलेट प्रतिस्थापन।

7

आप इस तरह अपने विन्यास फाइल में regexp परिभाषित कर सकते हैं:

regex = ^\d+(??{$stored_regex})$ 

लेकिन आप ब्लॉक है जहां आप अपने पर्ल कार्यक्रम में ऐसा करने से regexp का उपयोग कर रहे एक सुरक्षा जांच को निष्क्रिय करने की आवश्यकता होगी:

use re 'eval'; 
+1

यह सुरुचिपूर्ण समाधान है। –

0

एक स्पर्शरेखीय संबंधित पकड़ लिया: आप डबल प्रक्षेप इनलाइन करते हैं, और आप भी चर में प्रतिस्थापन तार है, पर विचार करें:

# the concat with doublequotes in the replacement string 
# are to make them PART OF THE STRING, NOT THE STRING DELIMITERS, 
# in other words, so the 2nd interpolation sees a double quoted string : 
#  eval eval $replace -> eval $1 hello world -> syntax error 
#  eval eval $replace -> eval "$1 hellow world" -> works ok 
# see: http://www.perlmonks.org?node_id=687031 

if($line =~ s/$search/'"' . $replace . '"'/ee) { 
    # STUFF... 
}