كيف يمكنني تحديد نوع المرجع المبارك في لغة بيرل؟

StackOverflow https://stackoverflow.com/questions/11085

  •  08-06-2019
  •  | 
  •  

سؤال

في لغة Perl، يعد الكائن مجرد إشارة إلى أي من أنواع بيانات Perl الأساسية التي تم مباركتها في فئة معينة.عند استخدام الدالة ref() على مرجع غير مبارك، يتم إخبارك بنوع البيانات الذي يشير إليه المرجع.ومع ذلك، عند استدعاء ref() على مرجع مبارك، يتم إرجاع اسم الحزمة التي تمت مباركة المرجع إليها.

أريد أن أعرف النوع الأساسي الفعلي للمرجع المبارك.كيف يمكنني تحديد هذا؟

هل كانت مفيدة؟

المحلول

Scalar::Util::reftype() هو الحل الأنظف.ال Scalar::Util تمت إضافة الوحدة النمطية إلى نواة Perl في الإصدار 5.7 ولكنها متاحة للإصدارات الأقدم (5.004 أو الأحدث) من CPAN.

يمكنك أيضًا التحقيق باستخدام UNIVERSAL::isa():

$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 أنواع.كانت الوحدة UNIVERSAL (التي تعمل كفئة أساسية لجميع الكائنات) جزءًا من النواة منذ إصدار Perl 5.003.

هناك طريقة أخرى - سهلة ولكنها قذرة بعض الشيء - وهي تقييد المرجع.على افتراض أن الفصل لم يثقل كاهل التوثيق فسوف تحصل على شيء مشابه Class=HASH(0x1234ABCD), ، والتي يمكنك تحليلها لاستخراج نوع البيانات الأساسي:

my $type = ($object =~ /=(.+)\(0x[0-9a-f]+\)$/i);

نصائح أخرى

ربما لا ينبغي عليك أن تفعل هذا.النوع الأساسي للكائن هو تفاصيل التنفيذ التي لا ينبغي عليك العبث بها.لماذا تريد أن تعرف هذا؟

وكان أول تفكيري في هذا هو:"الكائنات في لغة Perl هي دائمًا مراجع تجزئة، فما الاختراق؟"

لكن Scalar::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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top