स्ट्रिंग्स "वर्ण" है, जो एक बाइट से भी बड़ा कर रहे हैं के तार कर रहे हैं। 1 आप उनमें बाइट्स स्टोर कर सकते हैं और उन्हें कुशल बना सकते हैं जैसे कि वे पात्र हैं, substr
उनमें से हैं और इतने पर, और जब तक आप स्मृति में इकाइयों को जोड़ते हैं, तो सबकुछ सुंदर आड़ू है। डेटा भंडारण अजीब है, लेकिन यह ज्यादातर आपकी समस्या नहीं है। 2
जब आप फ़ाइलों से पढ़ने और लिखने का प्रयास करते हैं, तो तथ्य यह है कि आपके वर्ण बाइट्स पर मैप नहीं कर सकते हैं, यह महत्वपूर्ण और दिलचस्प हो जाता है। परेशान नहीं है। इस परेशानी वास्तव में पर्ल द्वारा सामान्य मामले में जो कुछ भी आप चाहते हैं उसे करने की कोशिश कर रही है: यदि स्ट्रिंग में सभी वर्ण बाइट में फिट होते हैं और आप एक गैर-विंडोज ओएस पर होते हैं, तो आपके पास वास्तव में नहीं है बाइट पढ़ने और लिखने के लिए कुछ भी विशेष करने के लिए। पर्ल शिकायत करेगा, हालांकि, यदि आपने एक गैर-बाइट आकार के चरित्र को संग्रहित किया है और इसे लिखने का प्रयास किए बिना इसे लिखने का प्रयास किया है।
यह काफी दूर है, क्योंकि बड़े पैमाने पर एन्कोडिंग एक बड़ा और भ्रमित विषय है। मुझे कुछ संदर्भों के साथ इसे छोड़ने दें: Encode(3perl), open(3perl), perldoc open, और perldoc binmode पर बहुत सारे उल्लसित और गहरी विवरणों के लिए देखें।
तो सारांश का जवाब है "हां, आप स्ट्रिंग्स का इलाज कर सकते हैं जैसे कि वे बाइट्स रखते हैं, यदि वे वास्तव में बाइट्स रखते हैं, जिसे आप बाइट्स को पढ़ने और लिखकर आश्वस्त कर सकते हैं।"
1: या पैडेंटिक रूप से, "जो बाइट की तुलना में मूल्यों की एक बड़ी श्रृंखला व्यक्त कर सकता है, हालांकि जब यह सुविधाजनक है तब बाइट्स के रूप में संग्रहीत किया जाता है"। मुझे लगता है।
2: रिकॉर्ड के लिए, पर्ल में तारों को आंतरिक रूप से 'पीवी' नामक डेटा संरचना द्वारा दर्शाया जाता है, जो एक चरित्र सूचक के अलावा स्ट्रिंग की लंबाई और pos
के वर्तमान मूल्य की तरह चीजें जानता है। 3
3: ठीक है, यह दिलचस्प होने पर pos
के वर्तमान मूल्य को संग्रहीत करना शुरू कर देगा। यह भी देखें
use Devel::Peek;
my $x = "bluh bluh bluh bluh";
Dump($x);
$x =~ /bluh/mg;
Dump($x);
$x =~ /bluh/mg;
Dump($x);
मेरी प्रकृति बहुत ही पैडेंटिक है, जब मैंने इसे प्रलेखन में पढ़ा तो मुझे 'चरित्र' अस्पष्ट मिला। मैं अस्पष्ट था अगर इसका मतलब डेटा की एक इकाई (यानी, एक बाइट) या स्ट्रिंग की एक इकाई (एन्कोडिंग पर निर्भर) – Mike
कॉलिंग 'बिनमोड फ़ाइल, ": कच्ची" '' 'बिनमोड फ़ाइल,": बाइट्स "हमेशा अपनी डिफ़ॉल्ट आईओ परत के बावजूद, अपने बाइटहेडल को "बाइट्स" मोड में खोलें (कहें, अगर आपने 'utf8' का उपयोग किया है)। – mob
मैं वास्तव में सहमत हूं कि "वर्ण" का उपयोग मुझे एक बग की तरह पढ़ता है, विशेष रूप से यह दिया गया है कि 'एनकोड (3perl)' में वर्ण, बाइट्स और ऑक्टेट्स के बीच भेद को कितना ध्यान दिया जाता है। यह सही शब्द होता है, लेकिन मुझे लगता है कि मुझे यह पसंद आएगा अगर यह "वर्ण (जैसा कि वर्तमान I/O परत द्वारा परिभाषित किया गया है)"। मुझे लगता है कि यह आपके उत्तर की भी आलोचना है, क्योंकि 'रीड' हमेशा "अक्षर" पढ़ता है - लेकिन कभी-कभी "चरित्र" को "ऑक्टेट" के रूप में परिभाषित किया जाता है और कभी-कभी "यूटीएफ -8 कोड पॉइंट" के रूप में परिभाषित किया जाता है। – darch