मैं पर्ल में एक धन्य संदर्भ के प्रकार को कैसे निर्धारित कर सकता हूं?

पर्ल में, एक ऑब्जेक्ट केवल किसी भी मूल पर्ल डेटा प्रकार का संदर्भ है जिसे किसी विशेष वर्ग में आशीर्वाद दिया गया है। जब आप एक unblessed संदर्भ पर ref() फ़ंक्शन का उपयोग करते हैं, तो आपको बताया जाता है कि संदर्भ डेटा किस प्रकार का संदर्भ देता है। हालांकि, जब आप एक धन्य संदर्भ पर ref() को कॉल करते हैं, तो आपको उस पैकेज का नाम वापस कर दिया जाता है जिसमें संदर्भ को आशीर्वाद दिया गया है।

मैं धन्य संदर्भ के वास्तविक अंतर्निहित प्रकार को जानना चाहता हूं। मैं इसे कैसे निर्धारित कर सकता हूं?

0
ro fr bn

3 उत्तर

और इस पर मेरा पहला विचार था: "पर्ल में ऑब्जेक्ट्स हमेशा हैश रेफ हैं, तो हैक क्या है?"

लेकिन, स्केलर :: Util :: reftype उत्तर है। यहां सवाल डालने के लिए धन्यवाद।

यह साबित करने के लिए यहां एक कोड स्निपेट है .. (यदि यह किसी के भी उपयोग में है)।

$> perl -e 'use strict; use warnings "all"; my $x = [1]; bless ($x, "ABC::Def"); use Data::Dumper; print Dumper $x; print ref($x) . "\n"; use Scalar::Util "reftype"; print reftype($x) . "\n"'`

आउटपुट:

$VAR1 = bless( [
                 1
               ], 'ABC::Def' );
ABC::Def
ARRAY
0
जोड़ा
वस्तुओं को अक्सर हैश संदर्भों के रूप में लागू किया जाता है, लेकिन यह एक आवश्यकता नहीं है। एक वस्तु कोई संदर्भ प्रकार हो सकता है।
जोड़ा लेखक brian d foy, स्रोत

Scalar::Util::reftype() is the cleanest solution. The Scalar::Util module was added to the Perl core in version 5.7 but is available for older versions (5.004 or later) from CPAN.

आप यूनिवर्सल :: आईएसए() के साथ भी जांच कर सकते हैं:

$x->isa('HASH')             # if $x is known to be an object
UNIVERSAL::isa($x, 'HASH')  # if $x might not be an object or reference

जाहिर है, आपको ARRAY और SCALAR प्रकारों की भी जांच करनी होगी। यूनिवर्सल मॉड्यूल (जो सभी वस्तुओं के लिए बेस क्लास के रूप में कार्य करता है) पर्ल 5.003 के बाद से कोर का हिस्सा रहा है।

एक और तरीका - आसान लेकिन थोड़ा गंदा - संदर्भ को स्ट्रिंग करना है। यह मानते हुए कि कक्षा ने अधिभारित अधिभारित नहीं किया है, आपको कक्षा = HASH (0x1234ABCD) जैसा कुछ मिलता है, जिसे आप अंतर्निहित डेटा प्रकार निकालने के लिए पार्स कर सकते हैं:

my $type = ($object =~ /=(.+)\(0x[0-9a-f]+\)$/i);
0
जोड़ा
आप बस {$ x-> आईएसए ($ प्रकार)} eval चाहते हैं; यदि यह कोई वस्तु नहीं है, तो आप वापस झूठ बोलते हैं। यदि यह सही प्रकार नहीं है, तो आप झूठी हो जाते हैं, और यदि यह सही प्रकार है, तो आप सच हो जाते हैं। :)
जोड़ा लेखक brian d foy, स्रोत

आपको शायद यह नहीं करना चाहिए। किसी ऑब्जेक्ट का अंतर्निहित प्रकार एक कार्यान्वयन विवरण है जिसके साथ आपको गड़बड़ नहीं करना चाहिए। आप यह क्यों जानना चाहेंगे?

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