2011-07-06 18 views
8

पर्ल में, निम्नलिखित दो संरचनाओं के बीच कभी भी कोई अंतर है:पर्ल में, क्या सीधे ग्लोब एलियासिंग और छेड़छाड़ के माध्यम से एलियासिंग के बीच कोई अंतर है?

*main::foo = *main::bar 

और

$main::{foo} = $main::{bar} 

वे एक ही कार्य करते हैं (*main::bar में परिभाषित किए गए *main::foo में सभी स्लॉट को अलियासिंग करना), लेकिन मैं बस सोच रहा हूं कि यह समकक्ष हमेशा रहता है या नहीं।

+3

मुझे उत्सुकता है कि यह क्या हुआ। :) –

+1

पूर्व में सख्त 'subs' या सख्त सक्षम होने पर पूर्व त्रुटि होती है, बाद वाले को अनुमति दी जाती है। – MkV

+1

मैं कुछ विधि नामों को उपनाम के लिए एक लूप लिख रहा था और सोच रहा था कि मैं हमेशा क्यों {{कोई सख्त 'रेफरी' लिखता हूं; * {'कुछ :: पीकेजी'। $ नया} = * {'कुछ :: पीकेजी'। $ पुराना} 'जब '$ कुछ :: pkg :: {$ new} = $ कुछ :: pkg :: {$ old } 'बस भी काम करेगा। सहजता से वे वही लगते हैं, लेकिन संबंधों/ओवरलोड/अन्य जादू जैसी चीजें "दिलचस्प" परिणाम हो सकती हैं अगर उन्होंने प्रतिलिपि को अलग-अलग, या तो एक बग या एक इच्छित व्यवहार के रूप में संभाला। –

उत्तर

9

शायद नहीं अंतर आप देख रहे थे की तरह है, लेकिन वहाँ *main::foo और $main::{foo} के बीच दो बड़े मतभेद हैं; पूर्व संकलन समय पर छेड़छाड़ में ग्लोब को देखता है, यदि आवश्यक हो तो इसे बनाते हैं, जबकि बाद में रन टाइम पर छिद्र में ग्लोब की तलाश होती है, और इसे नहीं बनाया जाएगा।

इससे किसी भी चीज में फटकारने के बारे में कोई फर्क पड़ सकता है, और यह निश्चित रूप से प्रभावित हो सकता है कि आपको used only once चेतावनी मिलती है या नहीं।

+0

मेरे जैसे लोगों के लिए जो पर्ल एसोटेरिक्स में नहीं हैं: [स्टैश एंड ग्लब्स] (http://www.perlmonks.org/?node=perlguts#Stashes_and_Globs): "* एक स्टैश एक हैश है जिसमें सभी अलग-अलग ऑब्जेक्ट्स हैं जो एक पैकेज के भीतर निहित हैं। छिद्र की प्रत्येक कुंजी एक प्रतीक नाम है (सभी प्रकार के ऑब्जेक्ट्स द्वारा साझा किया गया एक ही नाम है), और हैश तालिका में प्रत्येक मान एक जीवी (ग्लोब वैल्यू) है। यह जीवी इन बारी में उस नाम की विभिन्न वस्तुओं के संदर्भ शामिल हैं * "... पर्ल की सवारी कभी खत्म नहीं होती है! –

+0

@ डेविड टोनहोफर विशेष रूप से क्योंकि यह काफी सटीक नहीं है; कुछ मामलों में स्टैश में ऐसे मान हो सकते हैं जो जीवी नहीं हैं। – ysth

3

निम्न स्क्रिप्ट:

#!/usr/bin/env perl 

#mytest.pl 

no warnings; 


$bar = "this"; 
@bar = qw/ 1 2 3 4 5 /; 
%bar = qw/ key value /; 

open bar, '<', 'mytest.pl' or die $!; 

sub bar { 
    return "Sub defined as 'bar()'"; 
} 
$main::{foo} = $main::{bar}; 

print "The scalar \$foo holds $foo\n"; 
print "The array \@foo holds @foo\n"; 
print "The hash \%foo holds ", %foo, "\n"; 
my $line = <foo>; 
print "The filehandle 'foo' is reads ", $line; 
print 'The function foo() replies "', foo(), "\"\n"; 

आउटपुट:

The scalar $foo holds this 
The array @foo holds 1 2 3 4 5 
The hash %foo holds keyvalue 
The filehandle 'foo' is reads #!/usr/bin/env perl 
The function foo() replies "Sub defined as 'bar()'" 

तो अगर *main::foo = *main::bar;$main::{foo} = $main::{bar}; के रूप में एक ही बात नहीं करता है, मैं कैसे एक व्यावहारिक पता लगाने के लिए के रूप में एक नुकसान में हूँ अंतर। ;) हालांकि, एक वाक्यविन्यास परिप्रेक्ष्य से, ऐसी स्थितियां हो सकती हैं जहां एक विधि बनाम एक विधि का उपयोग करना आसान हो। ... प्रतीक तालिका में चारों ओर घूमने के बारे में सामान्य चेतावनियां हमेशा लागू होती हैं।

+0

मेरा अनुमान है कि कोई अंतर (यदि कोई है तो) कुछ गूढ़ जादू या अति उत्साही कैशिंग एल्गोरिदम में होगा।वाक्यगत रूप से निश्चित रूप से भिन्नताएं हैं, 'आयात' दिनचर्या में 'कोई सख्त' रेफरी 'के साथ ग्लोब असाइनमेंट के कोड को कॉलर को मैन्युअल रूप से अलग करने और स्तर के आधार पर प्रतीक तालिका स्तर को चलाने से थोड़ा छोटा (और तेज़) है, जो मुझे ग्लोब सिंटैक्स पसंद करने के लिए प्रेरित करता है, लेकिन अग्रिम में ज्ञात एक पूर्ण योग्य नाम (या पहले से ही किसी अन्य कारण के लिए छेड़छाड़ की प्रक्रिया) को लिखते समय, सिंटैक्टिक अंतर थोड़ा अस्पष्ट है, इसलिए सवाल :) –

+1

हुड के नीचे देख रहे हैं एक मजेदार मोड़ है। मुझे लगता है कि ऐसी स्थितियां हैं जहां अच्छी पुरानी ग्लोब नोटेशन सबसे स्पष्ट है, जबकि अन्य स्थितियां हैं जहां $ नेमस्पेस :: {कुंजी} नोटेशन स्पष्ट है। जो भी एक विशेष आवश्यकता के लिए स्पष्ट है, वह ऐसा करने का तरीका है। :) बेशक यदि कोई व्यक्ति प्रतीक तालिका के माध्यम से जाने के लिए एक विकल्प ढूंढ सकता है तो डिजाइन द्वारा दृष्टिकोण से बचने के कई कारण हैं। – DavidO

3

गुप्त कोष को एक्सेस करना के रूप में $A::{foo} = $obj आप जबकि *A::foo = $obj स्थानों $obj typeglob की उम्मीद स्लॉट पर $obj प्रकार के अनुसार प्रतीक मेज पर कुछ भी रख सकते हैं।

उदाहरण के लिए:

DB<1> $ST::{foo} = [1,2,3] 

    DB<2> *ST::bar = [1,2,3] 

    DB<3> x @ST::foo 
Cannot convert a reference to ARRAY to typeglob at (eval 7)[/usr/local/perl/blead-debug/lib/5.15.0/perl5db.pl:646] line 2. 
at (eval 7)[/usr/local/perl/blead-debug/lib/5.15.0/perl5db.pl:646] line 2 
    eval '([email protected], $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop; 
    @ST::foo; 

;' called at /usr/local/perl/blead-debug/lib/5.15.0/perl5db.pl line 646 
    DB::eval called at /usr/local/perl/blead-debug/lib/5.15.0/perl5db.pl line 3442 
    DB::DB called at -e line 1 
    DB<4> x @ST::bar 
0 1 
1 2 
2 3 
    DB<5> x \%ST:: 
0 HASH(0x1d55810) 
    'bar' => *ST::bar 
    'foo' => ARRAY(0x1923e30) 
     0 1 
     1 2 
     2 3 
संबंधित मुद्दे