كيف يمكنني استخدام قيمة المتغير كاسم متغير في بيرل؟

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

  •  22-09-2019
  •  | 
  •  

سؤال

إذا كان لدي متغير ، $bar, ، وهو ما يساوي السلسلة "foo" و $foo يساوي 0xdead, ، كيف يمكنني الحصول عليها $fooقيمة بينما لدي فقط السلسلة للاسم المتغير؟

في الأساس ، أريد أن أفعل نوعًا من عدم التوجيه المؤشر على مساحة الاسم العالمية أو بحث التجزئة على مساحة الاسم العالمية.

ما يلي لم ينجح:

perl -e 'my $foo=0xdead; my $bar ="foo"; print ${$bar}."\n";' 

يطبع الخط الجديد فقط.

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

المحلول

تعمل هذه الخدعة فقط مع المتغيرات العالمية (المراجع الرمزية تسعى إلى جدول الرمز من الحزمة الحالية) ، أي

perl -e '$foo=0xdead; my $bar ="foo"; print ${$bar}."\n";' 

إذا كنت ترغب في التقاط المعجائن ، فسيتعين عليك استخدامها eval ""

perl -e 'my $foo=0xdead; my $bar ="foo"; print eval("\$$bar"),"\n";' 

لكن باستخدام eval "" بدون هدف يعتبر أسلوبًا سيئًا في Perl ، وكذلك استخدام المتغيرات العالمية. فكر في استخدام المراجع الحقيقية (إذا استطعت).

نصائح أخرى

هناك حالات قليلة جدًا جدًا في Perl حيث يجب عليك استخدام المراجع الرمزية. تجنب المراجع الرمزية في جميع الحالات الأخرى لا يتعلق بالأناقة. إنه يتعلق بكونك مبرمج ذكي. مثل MJD يشرح في لماذا من الغباء "استخدام متغير كاسم متغير":

الجذر الحقيقي لرمز المشكلة هو: إنه هش. أنت تختلط على عكس الأشياء عند القيام بذلك. وإذا كان هناك اثنان من هؤلاء على عكس الأشياء لديهم نفس الاسم ، فسوف يصطدمون وستحصل على إجابة خاطئة. لذلك ينتهي بك الأمر إلى الحصول على قائمة طويلة كاملة من الأسماء التي يجب أن تكون حريصًا على عدم إعادة استخدامها ، وإذا كنت ستحصل على خطأ غريب للغاية. هذه هي بالضبط المشكلة التي تم اختراع مساحات الأسماء لحلها ، وهذا هو مجرد تجزئة: مساحة اسم محمولة.

أنظر أيضا الجزء 2 و الجزء 3.

بدون my ومع $$bar تناسبني:

$ perl -e '$foo=0xdead;$bar ="foo"; print $$bar."\n";'
57005

يمكنك معرفة المزيد حول استخدام متغير كاسم متغير في ال قائمة الأسئلة الشائعة بيرل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top