متى يجب استخدام حزمة متغير مقابل معجمي متغير (و ما فرق) ؟

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

سؤال

أنا أبحث في بعض كبار السن كود بيرل على بيرل الرهبان إلى معرفة البرمجة مع Win32::OLE و MS Word.المنتشرة في جميع أنحاء رمز المتغيرات مع أسماء مثل $MS::كلمة وما شابه ذلك من دون 'بلدي'المدرجة في الإعلان.بعد القراءة قليلا على جوجل, أنا أفهم أن هذه تسمى 'حزمة المتغيرات" مقابل "المعجمية المتغيرات' أعلن باستخدام بلدي.

سؤالي الأول: هلما هي حزمة المتغيرات جيدة ؟ '.أنا (اعتقد) أنا أفهم ما المعجمية المتغيرات, ولكن أنا لا أفهم الغرض من مجموعة المتغيرات أو كيفية استخدامها يختلف من lexicals لذا سؤالي الثاني سيكون،'ما هو الفرق بين المعجمية حزمة المتغيرات ؟ '

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

المحلول

مجموعة متغير يعيش في جدول الرموز, لذلك أعطت اسمها, فمن الممكن قراءة أو تعديل من أي حزمة أخرى أو نطاق.معجمي متغير في نطاق يتحدد نص البرنامج.القسم "المتغيرات الخاصة عبر بريدي()" في perlsub manpage يعطي المزيد من التفاصيل حول تحديد lexicals.

أقول لدينا ما يلي MyModule.pm:

package MyModule;

# these are package variables
our $Name;
$MyModule::calls = "I do not think it means what you think it means.";

# this is a lexical variable
my $calls = 0;

sub say_hello {
  ++$calls;

  print "Hello, $Name!\n";
}

sub num_greetings {
  $calls;
}

1;

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

#! /usr/bin/perl

use warnings;
use strict;

use MyModule;

foreach my $name (qw/ Larry Curly Moe Shemp /) {
  $MyModule::Name = $name;
  MyModule::say_hello;
}

print MyModule::num_greetings, "\n";

print "calls = $MyModule::calls\n";

البرنامج الناتج

Hello, Larry!
Hello, Curly!
Hello, Moe!
Hello, Shemp!
4
calls = I do not think it means what you think it means.

كما يمكنك أن ترى, حزمة المتغيرات جلوبل, لذلك كل المعتاد gotchas والمشورة ضد تطبيق.ما لم ينص صراحة على إمكانية الوصول ، من المستحيل رمز خارج MyModule حزمة للوصول إلى المعجمية $calls.

سيادة الإبهام هو تقريبا دائما تريد استخدام lexicals. بيرل أفضل الممارسات من قبل داميان كونواي هو المباشر:"لا تجعل المتغيرات جزء من وحدة واجهة"(التشديد في النص الأصلي).

نصائح أخرى

يجب عليك قراءة التعامل مع النطاق بواسطة MJD.

perldoc perlmod سيكون من المفيد أيضا قراءة.

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

أفضل طريقة قد تم استخدام الحشيش:

my %author = (
   email => 'author@example.com',
   ...
);

تجول جدول الرموز ليست ضرورية.

لدي بعض Win32::OLE أمثلة: http://www.unur.com/comp/ التي توجد أعمال فنية ولكن أعتقد هي التحسينات على هذا النمط.انظر أيضا لماذا عدد الصفحات في مستند Word مختلفة في بيرل و Word VBA?

أنا ذاهب إلى خرف قليلا:

@pgm::runtime_args = @ARGV ;

لذلك ، نحن التخلي عن معيار @ARGV مجموعة تدوس على pgm مساحة الاسم.ليس فقط أن كل مبرمج بيرل يعرف ما @ARGV هو.في أي حال ، @pgm::runtime_args لا تستخدم مرة أخرى في البرنامج النصي.

$pgm::maxargs = $#pgm::runtime_args + 1 ;

بالطبع @pgm::runtime_args في سياق الحجمي يعطينا عدد العناصر في الصفيف.ليس لدي فكرة لماذا $pgm::maxargs قد تكون هناك حاجة ، ولكن إذا كان عندها هذا الخط يجب أن يكون:

$pgm::maxargs = @pgm::runtime_args;

لن أقتبس أكثر من هذه الأشياء.أعتقد أن هذا هو ما يحدث عندما Cobol المبرمجين محاولة لكتابة بيرل.

$program::copyright = "Copyright (c) 02002 - Kenneth Tomiak : All rights reserved.";

أنا سعيد لأنه تخصيص خمسة أرقام السنة.يا لا تعرف أبدا!

PS:أعتقد أن بلدي مقتطفات تشكل الاستخدام العادل.

حزمة المتغيرات العالمية المتغيرات ؛ هم مرئية في كل مكان في البرنامج بأكمله (حتى وحدات أخرى).إنهم مفيدة عندما تريد أو تحتاج إلى هذا المستوى من الرؤية و/أو تأثير خارجي.على سبيل المثال النص::التفاف وحدة يستخدم منها السماح تكوين واحد نقطة عدد الأعمدة التي التفاف النص.وعلاوة على, حزمة المتغيرات تسمح لك باستخدام ما يسمى "النطاق الديناميكي" -- ولكن هذا هو إلى حد ما تقدما قليلا الباطنية المفهوم.

بالنسبة إلى السؤال الثاني ، انظر ما هو الفرق بين بلدي و في بيرل?

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