2011-11-30 6 views
11

सरल कोड:perl: precompiled संस्करण से मूल regex कैसे प्राप्त करें?

use 5.014; 
use warnings; 

my $re = <DATA>; 
chomp $re; 
my $re2 = qr/$re/; 
say $re2; 
__END__ 
^\w$ 

परिणाम:

(?^u:^\w$)  #added the (?^u: 

$ re2 डिकंपाइल करने के लिए मूल regex वापस पाने के लिए किसी भी सही तरीका है?

प्रेरणा: regex एक config मूल्य है, इसलिए जरूरत:

  • पढ़ यह
  • इसे बाद में उपयोग के लिए फाइल करने के लिए
  • यह बचाने संकलन।

लेकिन नहीं, क्योंकि हर संकलन regex के साथ विस्तार किया गया, बाद में उपयोग के लिए संकलित regex बचा सकता है (^ यू तो कई चक्र के बाद मैं की तरह साथ समाप्त हो गया :,:

(?^u:(?^u:(?^u:(?^u:(?^u:^\w$))))) 

इसलिए सवाल कर रहे हैं:

  • यहां किसी भी सही तरीका क्या है, कैसे संकलित संस्करण को बचाने के लिए
  • अगर कोई रास्ता नहीं - कैसे डिकंपाइल करने के लिए, मूल संस्करण प्राप्त करने के लिए
  • 01?
  • कोई विचार?
+0

आप कहते हैं कि आप एक फ़ाइल से पैटर्न पढ़ा है, तो तुम क्या आप एक फाइल करने के लिए सहेजना चाहते है, तो आप इसे क्यों नहीं बचाते? – ikegami

उत्तर

14

जबकि मैं केवल डेटा उपयोग के लिए स्ट्रिंग प्रतिलिपि रखता हूं, और उसके बाद मुझे प्रतिलिपि बनाने के लिए एक प्रतिलिपि बनाते हैं, तो आप संकलित बनाने के लिए प्रयुक्त पैटर्न को वापस करने के लिए re मॉड्यूल से regexp_pattern फ़ंक्शन का उपयोग भी कर सकते हैं regex:

use re 'regexp_pattern'; 

print regexp_pattern qr/^\w$/; 

प्रिंट

^\w$ 
+0

यह वही है जो मुझे चाहिए। 5.10 से ऊपर perl के साथ काम करना - तो ठीक है ...;) THANX! – jm666

+0

यह प्रिंट नहीं करता है, कम से कम 5.14 में नहीं। – ikegami

+0

qr/foo \/bar/ – ikegami

4

re::regexp_pattern

MagNET #perl पर इस ओर इशारा करते हुए के लिए vpit लिए क्रेडिट।

+0

बस यहां से पढ़ने के लिए 'उपयोग पुनः ...' के लिए एक और जवाब है। Thanx daxim भी - दुर्भाग्य से केवल एक स्वीकार कर सकते हैं .. – jm666

0

शायद के रूप में सरल रूप में:

... 
($reoriginal = $re2) =~ s{^\(\?.+:(.+)\)}{$1}; 
say $reoriginal 
+0

सावधान रहें, संस्करण असंगत: http://stackoverflow.com/q/8082617#comment-10190574 – daxim

3

मूल ऑपरेटर है, रेगेक्स पैटर्न नहीं। केवल regexp_pattern (पैटर्न) द्वारा लौटाए गए पहले मान को सूचना हानि में परिणाम मिलते हैं। आपको दूसरे (झंडे) को देखने की भी आवश्यकता है।

qr/foo/     # pat: foo flags: u 
qr/foo/u     # pat: foo flags: u 
use re '/u'; qr/foo/ # pat: foo flags: u 

qr/foo/a     # pat: foo flags: a 
use re '/a'; qr/foo/ # pat: foo flags: a 

qr/foo/i     # pat: foo flags: ui 
use re '/i'; qr/foo/ # pat: foo flags: ui 
use re '/a'; qr/foo/i # pat: foo flags: ai 
use re '/ai'; qr/foo/ # pat: foo flags: ai 

निकटतम संभव है कि आप मूल ऑपरेटर के लिए प्राप्त कर सकते हैं पाने के लिए, आप चाहते हैं

use re qw(regexp_pattern); 
my ($pat, $flags) = regexp_pattern($re); 
$pat =~ s{/}{\\/}g; 
say qq{qr/$pat/$flags}; 
+0

बहुत बहुत धन्यवाद! – JRFerguson

+0

मैं झंडे के बिना अपने regexs संकलित कर रहा हूँ, तो एरिक्स सरल संस्करण मेरे लिए पर्याप्त है। वैसे भी, विस्तृत स्पष्टीकरण के लिए बहुत बहुत धन्यवाद !!! – jm666

+0

@ jm666, फिर, यदि आप जानते हैं, तो आपको मूल पैटर्न को फिर से निकालने की आवश्यकता क्यों है? – ikegami

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