मैं अपने लिपियों में से एक पर पर्ल :: समालोचक भाग गया, और यह संदेश मिला:क्या पर्ल रेगेक्स को/x के साथ लिखने का कोई बेहतर तरीका है ताकि कोड अभी भी पढ़ना आसान हो?
Regular expression without "/x" flag at line 21, column 26. See page 236 of PBP.
मैं नीति जानकारी here देखा और मैं समझता हूँ कि विस्तारित मोड में नियमित अभिव्यक्ति लिख जो कोई देख रहा है में मदद मिलेगी कोड पर
हालांकि, मैं अपने कोड को/x ध्वज का उपयोग करने के लिए कैसे परिवर्तित करना है, इस तरह अटक गया हूं।
CPAN उदाहरण:
# Match a single-quoted string efficiently...
m{'[^\\']*(?:\\.[^\\']*)*'}; #Huh?
# Same thing with extended format...
m{
' # an opening single quote
[^\\'] # any non-special chars (i.e. not backslash or single quote)
(?: # then all of...
\\ . # any explicitly backslashed char
[^\\']* # followed by an non-special chars
)* # ...repeated zero or more times
' # a closing single quote
}x;
यह समझ में आता है अगर आप केवल regex को देखो।
मेरे कोड:
if ($line =~ /^\s*package\s+(\S+);/) {
मैं बिल्कुल यकीन है कि कैसे एक के अंदर एक विस्तारित regex का उपयोग करने के लिए अगर बयान नहीं कर रहा हूँ। मैं इसे इस तरह लिख सकता हूं:
if (
$line =~/
^\s* # starting with zero or more spaces
package
\s+ # at least one space
(\S+) # capture any non-space characters
; # ending in a semi-colon
/x
)
{
और यह काम करता है, लेकिन मुझे लगता है कि मूल से पढ़ने के लिए यह लगभग कठिन है। क्या यह लिखने के लिए एक बेहतर तरीका (या एक सर्वोत्तम अभ्यास तरीका) है? मुझे लगता है कि मैं qr // का उपयोग कर एक चर बना सकता हूं।
मैं वास्तव में इस विशिष्ट रेगेक्स को फिर से लिखने पर सलाह नहीं ढूंढ रहा हूं (हालांकि अगर मैं इसे सुधार सकता हूं, तो मैं सलाह लेता हूं) - मैं सलाह देता हूं कि एक रेगेक्स को कैसे अंदर विस्तारित किया जाए अगर बयान।
मुझे पता है पर्ल :: आलोचक सिर्फ एक दिशानिर्देश है, लेकिन इसका पालन करना अच्छा होगा।
अग्रिम धन्यवाद!
संपादित करें: तो कुछ जवाब प्राप्त करने के बाद, यह मेरे लिए स्पष्ट हो गया कि टिप्पणी के साथ एक regex बहु लाइन बनाने हमेशा जरूरी नहीं है। जो लोग मूल रेगेक्स को समझते हैं उन्हें यह समझने में सक्षम होना चाहिए कि मेरा उदाहरण क्या कर रहा था - मैंने जो टिप्पणियां जोड़ीं वह शायद थोड़ी अनावश्यक और वर्बोज़ थीं। मुझे विस्तारित रेगेक्स ध्वज का उपयोग करने का विचार पसंद है, लेकिन फिर भी रेगेक्स में रिक्त स्थान को रेगेक्स के प्रत्येक भाग को थोड़ा और स्पष्ट करने के लिए एम्बेड करना पसंद है। सभी इनपुट के लिए धन्यवाद!
मुझे करना था "\ A" का अर्थ देखने के लिए http://www.perl.com/doc/manual/html/pod/perlre.html पर जाएं। क्या यह "^" के बजाय पसंदीदा तरीका है? – BrianH
मुझे लगता है कि मैंने पहले एक सिंगल लाइन रेगेक्स में व्हाइटस्पेस जोड़ने का विचार नहीं किया था। मैं हमेशा "/ x" ध्वज के बारे में सोचता हूं, केवल एक बहु-रेखा ध्वज के रूप में, लेकिन मुझे वास्तव में उपरोक्त आपका उदाहरण पसंद है। – BrianH
@ ब्रायनएच: नहीं, वास्तव में नहीं। यदि आप/m का उपयोग करते हैं, और जब आप उपयोग करते हैं, तो यह केवल एक फर्क पड़ता है, आप आमतौर पर ^, नहीं \ A चाहते हैं। दूसरी तरफ $ अक्सर उपयोग किया जाता है जहां लोग वास्तव में \ z। – ysth