هل تعتبر علامات الاقتباس حول مفاتيح التجزئة ممارسة جيدة في لغة Perl؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

هل من الجيد اقتباس المفاتيح عند استخدام التجزئة في Perl؟

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

في ال كتاب أفضل ممارسات بيرل لداميان كونواي, ، يوجد هذا المثال الذي يوضح كيف تساعد المحاذاة في وضوح قسم من التعليمات البرمجية، لكنه لا يذكر (في أي مكان يمكنني العثور عليه في الكتاب) أي شيء يتعلق باقتباس مفاتيح التجزئة.

$ident{ name   } = standardize_name($name);
$ident{ age    } = time - $birth_date;
$ident{ status } = 'active';

ألن يكون من الأفضل كتابة هذا مع علامات الاقتباس للتأكيد على أنك لا تستخدم الكلمات المجردة؟

$ident{ 'name'   } = standardize_name($name);
$ident{ 'age'    } = time - $birth_date;
$ident{ 'status' } = 'active';
هل كانت مفيدة؟

المحلول

عند تحديد ثابتة مفاتيح تجزئة السلسلة، يجب عليك دائما استخدام علامات الاقتباس (واحد). على سبيل المثال، $hash{'key'} هذا هو الخيار الأفضل لأنه يغني عن الحاجة إلى التفكير في هذه المسألة، والنتائج في تنسيق متسق. إذا تركت قبالة نقلت أحيانا، عليك أن تتذكر لإضافتها عندما يحتوي المفتاح الخاص hypens الداخلية، مسافات أو أحرف خاصة أخرى. أنت <م> يجب نقلت استخدامها في تلك الحالات، مما يؤدي إلى التنسيق غير متناسقة (غير المدرجة في بعض الأحيان، ونقلت بعض الأحيان). مفاتيح نقلت هي أيضا أكثر عرضة للبناء جملة تسليط الضوء من قبل المحرر الخاص بك.

وهنا مثال حيث استخدام "نقلت في بعض الأحيان، وليس نقلت مرة أخرى" اتفاقية يمكن أن تحصل في ورطة:

$settings{unlink-devices} = 1; # I saved two characters!

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

نصائح أخرى

وبدون الاقتباس هو أفضل. انها في {} لذلك فمن الواضح أن كنت لا تستخدم barewords، بالإضافة إلى أنه على حد سواء أسهل في القراءة ونوع (اثنان أقل الرموز). ولكن كل هذا يعتمد على مبرمج، بطبيعة الحال.

وأنا لم الاقتباس واحد مفاتيح التجزئة. وأنا أعرف أن {} يعمل أساسا مثل نقلت القيام به، إلا في حالات خاصة (أ +، ونقلت المزدوج). بلدي محرر يعرف هذا أيضا، ويعطيني بعض الاشارات على أساس اللون للتأكد من أن فعلت ما نويت.

<ع> استخدام علامات الاقتباس المفردة، يبدو في كل مكان لي مثل ممارسة "الدفاعية" التي يرتكبها الناس التي لا تعرف بيرل. حفظ بعض الملابس لوحة المفاتيح وتعلم بيرل:)

ومع خرف خروج من الطريق، والسبب الحقيقي وأنا على نشر هذا التعليق ... يبدو أن تعليقات أخرى قد غاب عن حقيقة أن + سوف "نهاية الاقتباس" لbareword. وهذا يعني أنك يمكن أن يكتب:

sub foo {
    $hash{+shift} = 42;
}

وأو:

use constant foo => 'OH HAI';
$hash{+foo} = 'I AM A LOLCAT';

وهكذا فإنه من الواضح تماما أن +shift يعني "استدعاء الدالة التحول" وshift يعني "السلسلة" التحول ".

وسوف نشير أيضا إلى أن cperl وضع يسلط الضوء على جميع الحالات المختلفة بشكل صحيح. إذا لم يحدث ذلك، بينغ لي على IRC وأنا سأثبت ذلك:)

و(أوه، وأكثر شيء واحد. أفعل أسماء السمة الاقتباس في موس، كما هو الحال في has 'foo' => .... هذا هو عادة التقطت من العمل مع ستيفان، وعلى الرغم من أنني أعتقد أنها تبدو جميلة ... أنه يتعارض قليلا مع بقية قانون بلدي، وربما سوف يتوقف عن فعل ذلك في وقت قريب.)

تلقت

ومفاتيح Quoteless التجزئة الاهتمام على مستوى تركيب الكلام من لاري ستريت للتأكد من أنه لن يكون هناك أي سبب للهم أن يكونوا بخلاف أفضل الممارسات. لا عرق الاقتباس.

(وبالمناسبة، ونقلت على مفاتيح مجموعة <ط> هي أفضل الممارسات في PHP، ويمكن أن يكون هناك عواقب وخيمة لعدم استخدامها، ناهيك طن من E_WARNINGs حسنا في بيرل! = مايرام في PHP .)

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

$ident{'name'} = standardize_name($name);

ولكن لم تستخدمها على يسار المشغل السهم:

$ident = {name => standardize_name($name)};

لا تسألني لماذا، انها مجرد وسيلة لتحقيق ذلك:)

وأعتقد أن أهم شيء يمكنك القيام به هو دائما، دائما، دائما:

use strict;
use warnings; 

وبهذه الطريقة سوف مترجم قبض أية أخطاء الدلالات بالنسبة لك، ويترك لك أقل عرضة للأخطأت شيء، أيا كانت الطريقة التي قررت الذهاب.

وثاني أهم شيء هو أن تكون متسقة.

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

وهو نوع من السبب نفسه أنا استخدم " افتراضيا. إنها أكثر شيوعا بالنسبة لي أن صوت نزول المطر متغير في وسط سلسلة من استخدام حرف التي لا أريد محرف. وهو ما يعني، لقد أكثر غالبا ما تكون مكتوبة 'Hello, my name is $name' من "You owe me $1000".

وعلى الأقل، نقلا عن منع تسليط الضوء على تركيب الكلمات المحجوزة في المحررين ليست بهذه المثالية. راجع:

$i{keys} = $a;
$i{values} = [1,2];
...

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

$achoo['1']  = 'kleenex';
$achoo['14'] = 'hankies';

ولكن لا أحد يفعل ذلك. وأنها لا تساعد بكل وضوح، لأننا ببساطة إضافة إلى اثنين من أكثر الشخصيات للكتابة. تماما مثل بعض الأحيان نريد تحديدا فتحة # 3 في مجموعة، وأحيانا كنا نريد دخول PATH من %ENV. احد نقلا عن أنه إضافة <م> لا الوضوح بقدر ما انا قلق.

والطريقة بيرل يوزع كود يجعل من المستحيل استخدام أنواع أخرى من "الكلمات العارية" في مؤشر التجزئة.

وحاول

$myhash{shift}

وأنت تسير فقط للحصول على هذا البند تخزينها في التجزئة تحت مفتاح 'shift'، لديك للقيام بذلك

$myhash{shift()}

ومن أجل تحديد أنك تريد الوسيطة الأولى لمؤشر التجزئة الخاصة بك.

وبالإضافة إلى ذلك، وأنا استخدم جيديت ، و<م> فقط محرر البصرية (وهذا أنا لقد رأينا - إلى جانب ايماكس) التي تسمح <م> أنت السيطرة الكاملة على تسليط الضوء. لذلك فمن الواضح مضاعفا بالنسبة لي. أي شيء تبدو وكأنها السابق يحصل KEYWORD3 ($ myhash) + SYMBOL ({) + LITERAL2 (التحول) + SYMBOL (}) إذا كان هناك paranthesis قبل إغلاق مجعد يحصل KEYWORD3 + SYMBOL + KEYWORD1 + SYMBOL (()}). بالاضافة الى انني سوف يرجح تنسيق عليه مثل هذا أيضا:

$myhash{ shift() }

والذهاب مع علامات الاقتباس! انهم بصريا تفريق بناء الجملة، وسوف المزيد من المحررين تقديم الدعم لهم في تسليط الضوء على تركيب (مهلا، حتى تجاوز المكدس هو تسليط الضوء على نسخة الاقتباس). يهمني القول أيضا أن كنت لاحظت الأخطاء المطبعية أسرع مع المحررين التحقق الذي كنت أنهيت أقتبس الخاصة بك.

ومن الأفضل مع اقتباسات لأنه يتيح لك استخدام أحرف خاصة غير مسموح بها في barewords. باستخدام نقلت يمكنني استخدام أحرف خاصة من لغتي الأم في مفاتيح التجزئة.

يمكنك أن تسبق المفتاح بـ "-" (حرف ناقص) أيضًا، ولكن انتبه إلى أن هذا يُلحق "-" الى بداية من مفتاحك.من بعض الكود الخاص بي:

$args{-title} ||= "Intrig";

أستخدم الاقتباس الفردي والاقتباس المزدوج والطريقة التي لا تحتوي على علامات اقتباس أيضًا.الكل في نفس البرنامج :-)

ولقد تساءل عن ذلك بنفسي، وخصوصا عندما وجدت أنني قد قدمت بعض الهفوات:

 use constant CONSTANT => 'something';
 ...
 my %hash = ()
 $hash{CONSTANT}          = 'whoops!';  # Not what I intended
 $hash{word-with-hyphens} = 'whoops!';  # wrong again 

وماذا أنا أميل إلى القيام به الآن هو تطبيق نقلت عالميا على أساس لكل التجزئة إذا واحد على الأقل من مفاتيح حرفية يحتاج إليها. واستخدام الأقواس مع الثوابت:

 $hash{CONSTANT()} = 'ugly, but what can you do?';

ولقد استعملت دائما لهم دون أن يستشهد ولكن أود أن أردد استخدام صارمة وتحذيرات لأنها انتقاء معظم الأخطاء الشائعة.

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