كيف هو _ _ تختلف عن المدخلات اسمه أو حلقة الحجج?

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

  •  29-10-2019
  •  | 
  •  

سؤال

وأنا استخدم_ _ الكثير أريد أن أفهم استخدامه بشكل أفضل._ _ هو متغير عالمي للقيم الضمنية بقدر ما فهمت واستخدمته.

كما _ _ يبدو أنه تم تعيينه على أي حال ، هل هناك أسباب لاستخدام متغيرات الحلقة المسماة over_ بجانب سهولة القراءة?

في أي الحالات لا يهم_ _ هو متغير عالمي?

حتى إذا كنت تستخدم

for (@array){
    print $_;
}

أو حتى

print $_ for @array;

له نفس التأثير مثل

for my $var (@array){
    print $var;
}

ولكن هل يعمل نفسه?أعتقد أنه ليس بالضبط ولكن ما هي الاختلافات الفعلية?

تحديث:

يبدو_ _ حتى يتم تحديد نطاقه بشكل صحيح في هذا المثال.أليس العالمي بعد الآن?أنا أستخدم 5.12.3.

#!/usr/bin/perl
use strict;
use warnings;

my @array = qw/one two three four/;
my @other_array = qw/1 2 3 4/;

for (@array){
    for (@other_array){
        print $_;
    }
    print $_;
}

أن يطبع بشكل صحيح 1234واحد1234اثنان1234ثلاثة1234أربعة.

للعالمية _ _ كنت أتوقع 1234 4 1234 4 1234 4 1234 4 ..أم أنني أفتقد شيئا واضحا?

عندما يكون global _ العالمية ثم?

تحديث:

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

إلى جانب سهولة القراءة ، من الأفضل تجنب استخدام $_ لأن التوطين الضمني لـ _ _ يجب أن يكون معروفا ويؤخذ في الاعتبار وإلا فقد يواجه المرء سلوكا غير متوقع.

شكرا لتوضيح هذه المسألة.

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

المحلول

Genacodicetagpre

المشكلة ليست إذا تم تسميتهم أم لا.تكمن المشكلة في ما إذا كانت "متغيرات الحزمة" أو "المتغيرات المعجمية".

اطلع على الوصف الجيد جدًا لنظامي المتغيرات المستخدمة في Perl "التعامل مع النطاق":

http://perl.plover.com/FAQs/Namespaces.html

تعد متغيرات الحزمة متغيرات عامة ، وبالتالي يجب تجنبها لجميع الأسباب المعتادة (مثل العمل على مسافة).

يعتبر تجنب متغيرات الحزمة مسألة "العملية الصحيحة" أو "إدخال الأخطاء أصعب" بدلاً من "سهولة القراءة". Genacodicetagpre

في كل مكان.

السؤال الأفضل هو: Genacodicetagpre

هناك عدد قليل من الأماكن التي ستعمل فيها Perl على () ize $ _ من أجلك ، وبشكل أساسي foreach و grep و map.تتطلب جميع الأماكن الأخرى أن تكون محليًا () تضيفها بنفسك ، وبالتالي ستضخ خطأً محتملاً عندما تنسى حتمًا القيام بذلك.:-)

نصائح أخرى

وضع الفشل الكلاسيكي لاستخدام $_ (ضمنا أو صراحة) كمتغير حلقة هو

for $_ (@myarray) {
  /(\d+)/ or die;
  foo($1);
}

sub foo {
  open(F, "foo_$_[0]") or die;
  while (<F>) {
    ...
  }
}

حيث ، لأن متغير الحلقة في for/foreach لا بد أن عنصر القائمة الفعلي ، يعني أن while (<F>) الكتابة @myarray مع خطوط قراءة من الملفات.

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

نظرًا لأن $ _ متغير عام ، فقد تحصل على قيم غير متوقعة إذا حاولت استخدام قيمته التي حصل عليها من مقطع تعليمات برمجية سابق.قد تكون كتلة التعليمات البرمجية الجديدة جزءًا من حلقة أو عملية أخرى تُدخل قيمها الخاصة في $ _ ، لتحل محل ما كنت تتوقع وجوده هناك.

الخطر في استخدام $_ هو أنه عالمي (إلا إذا قمت بتوطينه مع local $_) ، وهكذا إذا كانت بعض الوظائف التي تتصل بها في الحلقة الخاصة بك تستخدم أيضا _ _ ، يمكن أن يتداخل الاستخدامان.

لأسباب غير واضحة بالنسبة لي ، فقد عضني هذا فقط من حين لآخر ، لكنني عادة ما أقوم بتوطين $_ إذا كنت أستخدمه داخل الحزم.

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

يجب أن تشعر بالحيرة تجاه الناتج حتى تكتشف أن perl سيحتفظ بالقيمة الأصلية لمتغير الحلقة عند خروج الحلقة (راجع perlsyn ).

لاحظ ex2 أعلاه.هنا تستخدم الحلقة الثانية الكود المعجمي المعجمي الذي تم الإعلان عنه في الحلقة الأولى.خفية ، لكنها متوقعة.مرة أخرى ، يتم الاحتفاظ بهذه القيمة عند الخروج ، لذا لا تتداخل الحلقتان.

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