متى بيرل لصناعة السيارات في تهيئة المتغيرات؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

وهنا بعض بسيطة بيرل لحساب عدد مرات حدوث قيمة في صفيف. هذا يعمل دون أي تحذيرات.

use warnings;
use strict;

my @data = qw(1 1 2 3 4 5 5 5 9);
my %histogram;
foreach (@data)
{
    $histogram{$_}++;
}

عند تغيير الجسم حلقة ل

$histogram{$_} = $histogram{$_} + 1;

وبيرل يحذر "استخدام قيمة غير مهيأ بالإضافة إلى ذلك".

ما يجري تحت غطاء محرك السيارة؟ لماذا هي القيمة تهيئة عند إمداده باعتبارها المعامل للمشغل ++ وغير مهيأ مع المشغل +؟

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

المحلول

والمشغل + تقييم كل من شكل إلى اليسار والنموذج إلى اليمين منه، ثم إرجاع مبلغ من الاثنين معا. تقييم دعوة التجزئة لا يرى أي سياق خاص.

والمشغل ++ لديه بعض سحر خاص بنيت في نقلا عن manpage perlop، بخصوص المشغل ++:.

<اقتباس فقرة>   

و"نديف" تعامل دائما أنه الرقمية، وعلى وجه الخصوص يتم تغيير إلى 0 قبل تزايد (بحيث ما بعد الزيادة من قيمة نديف سيعود 0 بدلا من "نديف").

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

نصائح أخرى

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

في هذه الحالة، كما قال Harleqin، ومشغلي زيادة تلقائية لها حالة خاصة.

وبعض مشغلي تغفل عمدا التحذير "غير مهيأ" لراحتك لأنها تستخدم عادة في الحالات التي يكون فيها "" القيمة الافتراضية 0 أو المعامل أو ترك الوحيد المنطقي.

وهذه هي: ++ و- (إما قبل أو بعد)، + =، - =، =، | =، ^ =، && =، || =

.

لاحظ أن بعض هذه تعطي خطأ التحذير عند استخدامها على متغير مرتبطة: انظر اختبارات ملحوظ TODO في <لأ href = "http://perl5.git.perl.org/perl.git/blob/HEAD: /t/op/assignwarn.t "يختلط =" نوفولو noreferrer "> http://perl5.git.perl.org/perl.git/blob/HEAD:/t/op/assignwarn.t .

وكما ذكر برايان: ما زال يفعل ذلك، فإنه فقط يحذرك. تحذيرات اقول لكم عن بعض التلاعب مع التأثيرات التي ربما لم يقصد.

وأنت على وجه التحديد <م> طلب لقيمة $histogram{$_}، مضيفا 1 إلى أنه وثم تعيينه لنفس الفتحة. انها نفس الطريقة التي لا اتوقع autovivification للعمل هنا:

my $hash_ref = $hash_for{$key_level_1};
$hash_ref->{$key_level_2} = $value;

وكما هو الحال هنا:

$hash_for{$key_level_1}{$key_level_2} = $value;

وسحر ربما لا تعمل مثل الأمثل. وتحسين مترجم سوف تلاحظ أن a = a + 1 هو نفس الشيء كما a++ بحيث كان هناك عامل زيادة في لغة التجميع، فإنه يمكن استخدام هذه التعليمات الأمثل بدلا من التظاهر أنه في حاجة للحفاظ على القيمة الأولى، ومن ثم الكتابة لأنه يسن 'ر حاجة فعلا.

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

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