هل هناك أي طريقة لاستخدام "ثابت" كمفتاح هاش في بيرل؟

هل هناك أي طريقة لاستخدام ثابت كمفتاح هاش؟

فمثلا:

use constant X => 1;

my %x = (X => 'X');

سيعمل الكود السابق على إنشاء علامة تجزئة مع "X" كمفتاح وليس رقم 1 كمفتاح. في حين ، أريد استخدام قيمة X الثابت كمفتاح.

0

9 إجابة

=> operator interprets its left side as a "string", the way qw() does.

جرب استخدام

my %x = ( X, 'X');
0
وأضاف

تعليقshelfoo (السمعة ليست عالية بما فيه الكفاية لإضافة تعليق مباشرة حتى الآن!)

اتفق تماما حول Perl Best Practices من قبل Damian Conway ... القراءة الموصى بها للغاية.

ومع ذلك ، يُرجى قراءة تعليق توصية الوحدة النمطية PBP ، وهو عبارة عن "errata" مفيدة إذا كنت خطة لاستخدام PBP للحصول على دليل في المنزل.

0
وأضاف
شكرا على ذلك ، من الجيد أن تعرف. لقد انتقلت من أزعج بيرل الخاص بي ، لذا من المرجح ألا أستخدمه إلا في المنزل ، ولكنني أعدت توجيه هذا الرابط إلى أحد الأشخاص الذين اعتدت العمل معهم.
وأضاف المؤلف shelfoo, مصدر

Your problem is that => is a magic comma that automatically quotes the word in front of it. So what you wrote is equivalent to ('X', 'X').

أبسط طريقة هي استخدام فاصلة فقط:

my %x = (X, 'X');

Or, you can add various punctuation so that you no longer have a simple word in front of the =>:

my %x = ( X() => 'X' );
my %x = ( &X => 'X' );
0
وأضاف

يستخدم استخدام ثابت pragma نموذجًا بروتينيًا أوليًا لأخذ أي وسائط. بينما يبدو يبدو ثابتًا على نمط C ، فهو في الواقع عبارة عن روتين فرعي يُرجع قيمة ثابتة.

The => (fat comma) automatically quotes left operand if its a bareword, as does the $hash{key} notation.

إذا كان استخدامك للاسم الثابت يبدو مثل bareword ، فستبدأ آليات الاقتراع وستحصل على اسمها كمفتاح بدلاً من قيمته. لمنع هذا ، قم بتغيير الاستخدام بحيث لا يكون bareword. فمثلا:

use constant X => 1;
%hash = (X() => 1);
%hash = (+X => 1);
$hash{X()} = 1;
$hash{+X} = 1;

في الإصدارات الأولية ، يمكنك أيضًا استخدام الفاصلة البسيطة بدلاً من ذلك:

%hash = (X, 1);
0
وأضاف

استخدم $ hash {CONSTANT ()} أو $ hash {+ CONSTANT} لمنع آلية queware quoting الآلية من الركل.

From: http://perldoc.perl.org/constant.html

0
وأضاف

use constant actually makes constant subroutines.

للقيام بما تريد ، تحتاج إلى الاتصال الفرعي بشكل صريح:

use constant X => 1;

my %x = ( &X => 'X');

أو

use constant X => 1;

my %x = ( X() => 'X');
0
وأضاف

إحدى الطرق هي تغليف X كـ X):

my %x ( (X) => 1 );

Another option is to do away with '=>' and use ',' instead:

my %x ( X, 1 );
0
وأضاف

خيار آخر هو عدم استخدام استخدام pragma ثابت والوجه إلى Readonly حسب التوصيات في Perl Best Practices بواسطة Damian Conway.

لقد تحولت مرة أخرى بعد أن أدركت أن مرجع التجزئة الثابت ليس سوى إشارة ثابتة إلى التجزئة ، ولكن لا تفعل أي شيء حيال البيانات داخل التجزئة.

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


use Readonly;

Readonly my $CONSTANT => 'Some value';

$hash{$CONSTANT} = 1;

0
وأضاف
انها ليست الوحدة الأساسية.
وأضاف المؤلف ceving, مصدر

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

في بيرل ، بمجرد الإعلان عن روتين فرعي ، يمكن استدعاؤه دون أقواس.

Understanding that "constants" are simply subroutines, you can see why they are not interpolated in strings and why the "fat comma" operator "=>" which quotes the left-hand argument thinks you've handed it a string (try other built-in functions like time() and keys() sometime with the fat comma for extra fun).

لحسن الحظ ، يمكنك استدعاء ثابت باستخدام علامات ترقيم صريحة مثل parens أو الوصاية.

ومع ذلك ، لدي سؤال لك: لماذا تستخدم الثوابت لمفاتيح التجزئة على الإطلاق؟

يمكنني التفكير في بعض السيناريوهات التي قد تقودك في هذا الاتجاه:

  1. تريد التحكم في المفاتيح التي يمكن أن تكون في التجزئة.

  2. تريد تجريد اسم المفاتيح في حالة التغيير لاحقًا

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

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

آمل أن يساعد هذا وشكرا على وقتك.

0
وأضاف