2008-10-18 10 views
5

निम्नलिखित पर्ल स्टेटमेंट यूनिक्सिश मशीनों पर समान रूप से व्यवहार करते हैं। क्या वे विंडोज पर अलग-अलग व्यवहार करते हैं? यदि हां, तो यह जादू की वजह से है?क्या पर्ल का/एम रेगेक्स संशोधक विंडोज पर अलग-अलग मिलान करता है?

split m/\015\012/ms, $http_msg; 
    split m/\015\012/s, $http_msg; 

मैं एक Win32 धुआं परीक्षक से मेरी CPAN मॉड्यूल से एक पर एक failure मिला है। ऐसा लगता है कि यह एक \ r \ n बनाम \ n मुद्दा है। हाल ही में किए गए एक बदलाव को मेरे regexes में // m जोड़ना था।

उत्तर

12

इन regexes के लिए:

m/\015\012/ms 
m/\015\012/s 

दोनों/मी और/s व्यर्थ कर रहे हैं।

  • /एस: . मैच \n भी बनाता है। आपका regex .
  • /मी शामिल नहीं है: ^ और $ मैच स्ट्रिंग में \n एम्बेडेड के बगल में बना देता है। आपके रेगेक्स में ^ और न ही $, या उनके समानार्थी शब्द हैं। अपने इनपुट हैंडल (सॉकेट?) पाठ मोड में काम करता है, तो

क्या संभव है वास्तव में है, \r (\015) वर्ण विंडोज पर हटा दिया गया है जाएगा।

तो, क्या करना है? मैं के लिए/मी,/s विभाजन \015 पात्रों वैकल्पिक करने का सुझाव है, और

/\015?\012/ 

कोई ज़रूरत नहीं के खिलाफ या यहां तक ​​कि प्रमुख m//। वे सिर्फ कार्गो पंथ हैं।

+0

ARGH! मुझे लगता है कि आप सही हैं और मैं रेगेक्स संशोधक के साथ गलत ट्रैक पर था। मैं एक subprocess से इनपुट प्राप्त करने के लिए '' 'का उपयोग कर रहा हूँ और कभी भी binmode के बारे में चिंता करने के लिए सोचा नहीं ... –

1

आपने /m क्यों जोड़ा? क्या आप लाइन पर विभाजित करने की कोशिश कर रहे हैं? यदि आप लाइनों के रूप में एक बड़ा स्ट्रिंग का इलाज करना चाहते हैं

my @lines = split /^/m, $big_string; 

हालांकि,, बस अदिश के लिए एक संदर्भ पर एक filehandle खोलने: कि /m के साथ regex में या तो ^ या $ उपयोग करने की आवश्यकता करने के लिए

open my $string_fh, '<', \ $big_string; 
while(<$string_fh>) { 
    ... process a line 
    } 
3

कोई जादू \n नहीं है। \n और \r दोनों का अर्थ हमेशा एक चरित्र है, और सभी ASCII- आधारित प्लेटफ़ॉर्म पर क्रमशः \cJ और \cM है। (अपवाद EBCDIC प्लेटफार्मों (स्पष्ट कारणों के लिए कर रहे हैं) और MacOS क्लासिक (जहां \n और \r दोनों का मतलब \cM)।)

जादू है कि Windows पर होता यह है कि जब मैं/हे एक फ़ाइल हैंडल कि के रूप में चिह्नित किया गया है के माध्यम से कर रही है टेक्स्ट मोड में होने पर, \r\n को पढ़ने पर और पढ़ने के विपरीत \n पर अनुवाद किया गया है। (इसके अलावा, \cZ को अंत-फ़ाइल के लिए लिया जाता है - आश्चर्य!) यह सी रनटाइम लाइब्रेरी परत पर किया जाता है।

आपको इसे ठीक करने के लिए binmode अपनी सॉकेट की आवश्यकता है।

आप भी अपने पैटर्न से /s और /m संशोधकों को निकालने चाहिए: जब से तुम मेटा-वर्ण जिसका व्यवहार वे संशोधित (. और ^/$ जोड़ी, क्रमशः) का उपयोग नहीं करते हैं, वे कुछ भी नहीं - कार्गो पंथ।

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