2010-08-03 12 views
13

जब मैं स्ट्रिंग पर एक संगतता करता हूं तो दृश्यों के पीछे क्या हो रहा है?पर्ल स्ट्रिंग अपरिवर्तनीय हैं?

my $short = 'short'; 
$short .= 'cake'; 

पर्ल प्रभावी रूप से एक नया स्ट्रिंग बनाने, तो यह सही चर संदर्भ बताए है, या पर्ल तार हमेशा स्वभाव से परिवर्तनशील कर रहे हैं?

इस प्रश्न के लिए प्रेरणा एक सहकर्मी के साथ हुई चर्चा से आई, जिन्होंने कहा कि पटकथा भाषा अपरिवर्तनीय तारों का उपयोग कर सकती है।

+0

'perldoc' में किसी भी ठोस संदर्भ की सराहना की जाएगी। – Zaid

+0

* ठोस संदर्भ * कुछ के लिए बहुत ठोस हो सकते हैं: 'perldoc perlguts' और 'SvGROW' के आसपास और आसपास देखो। अन्यथा, @ यूजीन से प्रतिक्रिया वह है जिसे आप ढूंढ रहे हैं। – Dummy00001

+0

'subl'' के 'perlfunc' प्रलेखन (जैसा कि एक लवल्यू और एक 4-तर्क आमंत्रण दोनों) स्ट्रिंग को स्वयं संशोधित करने का वर्णन करता है: भागों को बढ़ाना, घटाना और बदलना। – pilcrow

उत्तर

17

पर्ल स्ट्रिंग्स उत्परिवर्तनीय हैं। यदि आवश्यक हो तो पर्ल स्वचालित रूप से नए बफर बनाता है।

use Devel::Peek; 
my $short = 'short'; 

Dump($short); 
Dump($short .= 'cake'); 
Dump($short = ""); 

SV = PV(0x28403038) at 0x284766f4 
    REFCNT = 1 
    FLAGS = (PADMY,POK,pPOK) 
    PV = 0x28459078 "short"\0 
    CUR = 5 
    LEN = 8 
SV = PV(0x28403038) at 0x284766f4 
    REFCNT = 1 
    FLAGS = (PADMY,POK,pPOK) 
    PV = 0x28458120 "shortcake"\0 
    CUR = 9 
    LEN = 12 
SV = PV(0x28403038) at 0x284766f4 
    REFCNT = 1 
    FLAGS = (PADMY,POK,pPOK) 
    PV = 0x28458120 ""\0 
    CUR = 0 
    LEN = 12 

ध्यान दें कि तीसरे मामले में कोई नया बफर आवंटित नहीं किया गया है।

+2

पर्ल रीयलोक का उपयोग करता है, जो पूरी तरह से नया बफर – ysth

+0

प्राप्त कर सकता है या नहीं, ध्यान दें कि पर्ल एक पिछली नल के लिए कमरा आवंटित करता है, भले ही यह लंबाई निर्धारित करने के लिए इसका उपयोग न करे। यह भी ध्यान रखें कि जहां भी संभव हो, यह मॉलोक लाइब्रेरी और राउंड आवंटन की ग्रैन्युलरिटी को जानता है – ysth

12

पर्ल तार निश्चित रूप से उत्परिवर्तनीय हैं। प्रत्येक उपयोग की गई लंबाई के अलावा आवंटित बफर आकार को स्टोर करेगा और ऑफसेट शुरू करेगा, और बफर को आवश्यकतानुसार विस्तारित किया जाएगा।

+1

क्या 'perldoc' में इसका कोई कठोर संदर्भ है? – Zaid

+0

@Zaid: नहीं कि मुझे ऑफहैंड – ysth

0
$short = 'short'; 
print \$short; 

$short .= 'cake'; 
print \$short; 

इस कोड को मैं क्रियान्वित करने के बाद (शुरुआत ऑफसेट तरह तपेदिक़ संचालन/^ एबीसी // वास्तविक डेटा को स्थानांतरित करने की जरूरत नहीं है। अनुमति देने के लिए उपयोगी है) "SCALAR (0x955f468) SCALAR (0x955f468)" । मेरा जवाब 'mutable' होगा।

+7

पता है कि पर्ल स्केलर वास्तव में दो अलग-अलग वर्गों से बना है; निश्चित आकार में से एक, और एक वैकल्पिक चर (आकार के मूल्यों के प्रकार के आधार पर) आकार। पता निश्चित आकार घटक का है; यह पूरी तरह से व्यवहार्य है कि चर घटक को एक नए के लिए बदल दिया जा सकता है। लेकिन वास्तव में यह मामला नहीं है। :) – ysth

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