2011-01-07 9 views
5

perldoc के अनुसार, विभाजन के लिए वाक्य रचना है: split "PATTERN", EXPR:पर्ल विभाजन पैटर्न

split /PATTERN/,EXPR,LIMIT 

लेकिन PATTERN भी एक एकल या डबल-कोटेड स्ट्रिंग हो सकता है। क्या फर्क पड़ता है?

संपादित करें: बैकस्लाश पर विभाजित होने के बारे में मुझे पता है: split /\\/ बनाम split '\\'। दूसरा रूप काम नहीं करता है।

+0

जो अंतर आप देख रहे हैं वह इंटरपोलेशन के कारण होता है। '/ \\ /' एक पैटर्न है जिसमें एक बैकस्लैश होता है। '' \\ '' एक स्ट्रिंग है जिसमें एक बैकस्लैश होता है। जब उस स्ट्रिंग को पैटर्न के रूप में व्याख्या किया जाता है तो ऐसा लगता है कि आपने '/ \ /' लिखा था, जो अमान्य है। वही व्यवहार प्राप्त करने के लिए आपको बैकस्लाश को दोगुना करना होगा: '' \\\\ '' –

+0

@ माइकल: इन्हें बैकस्लैश एस्केप दृश्य कहा जाता है, इंटरपोलेशन नहीं। –

उत्तर

6

ऐसा लगता है कि इसे इस्तेमाल करता है की तरह के रूप में "पैटर्न निर्दिष्ट करने के लिए एक अभिव्यक्ति" कि:

पैटर्न/पैटर्न/पैटर्न जो रनटाइम के दौरान अलग-अलग निर्दिष्ट करने के लिए एक अभिव्यक्ति के साथ प्रतिस्थापित किया जा सकता। (क्रम संकलन केवल एक बार करने के लिए, का उपयोग /$ चर/ओ।)

संपादित करें: मैं इस के साथ यह परीक्षण किया:

my $foo = 'a:b:c,d,e'; 
print join(' ', split("[:,]", $foo)), "\n"; 
print join(' ', split(/[:,]/, $foo)), "\n"; 
print join(' ', split(/\Q[:,]\E/, $foo)), "\n"; 

' ' विशेष मामले के अलावा, यह सिर्फ तरह लग रहा है एक नियमित अभिव्यक्ति।

+0

एक उदाहरण जहां यह नहीं करता है: 'विभाजित/\\/'बनाम' विभाजित '\\''। – planetp

+1

अधिक सटीक होने के लिए, 'विभाजित EXPR, ...' (जहां EXPR एक शाब्दिक नहीं है '/.../ ') लगभग' मेरे {पैटर्न = EXPR के बराबर है; विभाजित/$ पैटर्न /, ...} '(' '' विशेष मामले को छोड़कर)। यही कारण है कि '' \\ ''काम नहीं करता है; परिणामी '$ पैटर्न' में केवल 1 बैकस्लैश होता है, और आपको वैध रेगेक्स रखने के लिए 2 की आवश्यकता होती है। – cjm

0

दो नमूदार नियम:

  • विशेष मामला split(" ")split(/\s+/) के बराबर है।
  • बाकी सब के लिए (ऐसा लगता है-इसे कील मुझे), split("something")split(/something/)
+0

यह इसका इलाज '\ Q \ E' के साथ बिल्कुल नहीं करता है; यह सिर्फ '/ कुछ/'के रूप में व्यवहार करता है। –

+0

यह सही नहीं है। एक स्ट्रिंग एक मानक regex की तरह व्यवहार करता है। – krakover

+0

'विभाजन' ''स्प्लिट/\ s + /' जैसा है, सिवाय इसके कि पूर्व एक प्रमुख खाली क्षेत्र छोड़ देता है। – ysth

1

के बराबर है मेरा मानना ​​है कि वहाँ कोई अंतर नहीं है। एक स्ट्रिंग पैटर्न को नियमित अभिव्यक्ति के रूप में भी व्याख्या किया जाता है।

1
perl -e 'print join("-",split("[a-e]","regular"))'; 
r-gul-r 

जैसा कि आप देखते हैं, डेलीमीटर को एक नियमित अभिव्यक्ति के रूप में व्याख्या किया जाता है, स्ट्रिंग अक्षर नहीं।

तो, यह ज्यादातर एक ही अपवाद है: split(" ",...) और split(/ /,...) अलग हैं।

मैं भ्रम से बचने के लिए /PATTERN/ का उपयोग करना पसंद करता हूं, यह भूलना आसान है कि यह अन्यथा एक regexp है।

2

PATTERN हमेशा के रूप में व्याख्या किया जाता है ... अच्छा, एक पैटर्न - कभी भी एक शाब्दिक मूल्य के रूप में नहीं। यह या तो regex या एक स्ट्रिंग हो सकता है। स्ट्रिंग्स को रेगेक्स में संकलित किया जाता है। अधिकांश भाग के लिए व्यवहार एक जैसा है, लेकिन दोहरी व्याख्या के कारण सूक्ष्म मतभेद हो सकते हैं।

स्ट्रिंग '\\' में केवल एक बैकस्लैश है। जब एक पैटर्न के रूप में व्याख्या, यह के रूप में यदि आप /\/ लिखा था, जो अवैध है:

C:\>perl -e "print join ':', split '\\', 'a\b\c'" 
Trailing \ in regex m/\/ at -e line 1. 

ऊप्स!

  • खाली पैटर्न //, जो रिक्त स्ट्रिंग पर विभाजन:

    इसके अतिरिक्त, दो विशेष मामले हैं।

  • एक एकल स्थान ' ', जो किसी भी को अग्रणी या पिछली सफेद जगह पर ट्रिम करने के बाद व्हाइटस्पेस पर विभाजित होता है।

1. regexes या तो इनलाइन /.../ या एक precompiled qr// उद्धृत स्ट्रिंग के माध्यम से आपूर्ति की जा सकती।

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