هذا هو الأمر perlmod الذي يمكن تشغيله في موفر الاستضافة المجاني OnWorks باستخدام إحدى محطات العمل المجانية المتعددة عبر الإنترنت مثل Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت
برنامج:
اسم
perlmod - وحدات بيرل (حزم وجداول الرموز)
الوصف
Is هيه وثيقة لصحتك! كان بعد؟
هناك مستندات أخرى قد تحتوي على المعلومات التي تبحث عنها:
هذا المستند
حزم Perl ومساحات الأسماء وبعض المعلومات عن الفئات.
بيرلنيومود
البرنامج التعليمي حول إنشاء وحدة جديدة.
com.perlmodstyle
أفضل الممارسات لإنشاء وحدة نمطية جديدة.
الباقات
توفر لغة Perl آلية لمساحات الأسماء البديلة لحماية الحزم من الدوس عليها
متغيرات بعضهم البعض. في الواقع، لا يوجد حقًا شيء اسمه متغير عالمي
بيرل. يعلن بيان الحزمة أن وحدة الترجمة موجودة في المعطى
مساحة الاسم. نطاق إعلان الحزمة يبدأ من الإعلان نفسه وحتى
نهاية الكتلة المرفقة، "eval"، أو الملف، أيهما يأتي أولاً (نفس النطاق مثل
هيه لي() محلي() العاملين). ستكون المعرفات الديناميكية غير المؤهلة موجودة في هذا
مساحة الاسم، باستثناء تلك المعرفات القليلة التي إذا كانت غير مؤهلة، فستكون القيمة الافتراضية هي main
الحزمة بدلاً من الحزمة الحالية كما هو موضح أدناه. يؤثر بيان الحزمة فقط
المتغيرات الديناميكية - بما في ذلك تلك التي استخدمتها محلي() على--ولكن ليس المتغيرات المعجمية
تم إنشاؤها باستخدام لي(). عادةً ما يكون هذا هو الإعلان الأول في ملف تم تضمينه بواسطة ملف
عوامل التشغيل "do" أو "require" أو "use". يمكنك التبديل إلى باقة في أكثر من باقة
مكان؛ إنه يؤثر فقط على جدول الرموز الذي يستخدمه المترجم لبقية المهام
تلك الكتلة. يمكنك الرجوع إلى المتغيرات ومقابض الملفات في الحزم الأخرى عن طريق البادئة
المعرف باسم الحزمة ونقطتين مزدوجتين: $Package::Variable. إذا كانت الحزمة
الاسم فارغ، ومن المفترض أن تكون الحزمة "الرئيسية". وهذا يعني أن $::sail يعادل
$الرئيسية::sail.
كان محدد الحزمة القديم عبارة عن اقتباس واحد، ولكن النقطتين المزدوجتين هو المفضل الآن
المحدد، جزئيًا لأنه أكثر قابلية للقراءة من قبل البشر، وجزئيًا لأنه أكثر قابلية للقراءة
قابلة للقراءة ل ايماكس وحدات الماكرو. كما أنه يجعل مبرمجي C++ يشعرون أنهم يعرفون ما يحدث
on-- بدلاً من استخدام علامة الاقتباس المفردة كفاصل، والتي كانت موجودة لإنشاء Ada
يشعر المبرمجون وكأنهم يعرفون ما يحدث. لأن بناء الجملة القديم هو
لا يزال مدعومًا للتوافق مع الإصدارات السابقة، إذا حاولت استخدام سلسلة مثل "This is
$owner's house"، ستتمكن من الوصول إلى $owner::s؛ أي المتغير $s في package
"المالك"، وهو على الأرجح ليس ما تقصده. استخدم الأقواس لتوضيح الغموض، كما في "هذا هو
منزل ${مالك}".
قد تحتوي الحزم نفسها على فواصل الحزمة، كما في $OUTER::INNER::var. هذا
ومع ذلك، لا يشير هذا إلى أي شيء يتعلق بترتيب عمليات البحث عن الأسماء. لا توجد حزم نسبية:
جميع الرموز إما محلية للحزمة الحالية، أو يجب أن تكون مؤهلة بالكامل من
اسم الحزمة الخارجية لأسفل. على سبيل المثال، لا يوجد مكان داخل الحزمة "OUTER" يتضمن ذلك
يشير $INNER::var إلى $OUTER::INNER::var. يشير "INNER" إلى عالمي منفصل تمامًا
الحزمة.
يتم تخزين المعرفات التي تبدأ بالأحرف (أو الشرطة السفلية) فقط في رمز الحزمة
طاولة. يتم الاحتفاظ بجميع الرموز الأخرى في الحزمة "الرئيسية"، بما في ذلك جميع متغيرات علامات الترقيم،
مثل $_. بالإضافة إلى ذلك، عندما تكون غير مؤهلة، فإن المعرفات STDIN، STDOUT، STDERR، ARGV،
ARGVOUT، وENV، وINC، وSIG مجبرون على التواجد في الحزمة "الرئيسية"، حتى عند استخدامها لأغراض أخرى
الأغراض من تلك المضمنة. إذا كان لديك حزمة تسمى "m" أو "s" أو "y"، إذن
لا يمكنك استخدام النموذج المؤهل للمعرف لأنه سيتم تفسيره بدلاً من ذلك
كمطابقة نمط، أو استبدال، أو تحويل صوتي.
تم استخدام المتغيرات التي تبدأ بالشرطة السفلية في الحزمة الرئيسية، لكننا قررنا ذلك
كان أكثر فائدة لكتاب الحزم ليتمكنوا من استخدام الشرطة السفلية للإشارة
المتغيرات الخاصة وأسماء الطرق. ومع ذلك، المتغيرات والوظائف المسماة مع واحد
لا تزال "_"، مثل $_ و"sub _"، مفروضة على الحزمة "الرئيسية". أنظر أيضاً "
بناء جملة أسماء المتغيرات" في perlvar.
يتم تجميع سلاسل "التقييم" في الحزمة التي يوجد فيها ملف وحدة التقييم () تم تجميعه.
(مع ذلك، تفترض التعيينات إلى $SIG{} أن معالج الإشارة المحدد موجود في "الرئيسي"
طَرد. قم بتأهيل اسم معالج الإشارة إذا كنت ترغب في الحصول على معالج إشارة في ملف
package.) على سبيل المثال، افحص بيرلدب.بل في مكتبة بيرل. فإنه يتحول في البداية
إلى الحزمة "DB" حتى لا يتداخل المصحح مع المتغيرات الموجودة في البرنامج
أنت تحاول تصحيح الأخطاء. ومع ذلك، فإنه في نقاط مختلفة، يعود مؤقتًا إلى
الحزمة "الرئيسية" لتقييم التعبيرات المختلفة في سياق الحزمة "الرئيسية" (أو
من حيث أتيت). انظر بيرلديبوج.
يحتوي الرمز الخاص "__PACKAGE__" على الحزمة الحالية، ولكن لا يمكن (بسهولة) استخدامها
لبناء أسماء المتغيرات.
راجع perlsub للتعرف على مشكلات تحديد النطاق الأخرى المتعلقة بـ لي() محلي()، و perlref بخصوص
الإغلاق.
رمز طاولات
يحدث أن يتم تخزين جدول الرموز الخاص بالحزمة في تجزئة هذا الاسم مع اثنين
تم إلحاق النقطتين. وبالتالي فإن اسم جدول الرموز الرئيسي هو %main::، أو %:: للاختصار.
وبالمثل يتم تسمية جدول الرموز الخاص بالحزمة المتداخلة المذكورة سابقًا
٪خارجي داخلي::.
القيمة الموجودة في كل إدخال للتجزئة هي ما تشير إليه عند استخدام الاسم *
تدوين typeglob.
local *main::foo = *main::bar;
يمكنك استخدام هذا لطباعة كافة المتغيرات الموجودة في الحزمة، على سبيل المثال. المعيار
ولكن العتيقة dumpvar.pl المكتبة ووحدة CPAN Devel::Symdump تستفيد من هذا.
نتائج إنشاء إدخالات جدول الرموز الجديدة مباشرة أو تعديل أي إدخالات ذلك
ليست بالفعل typeglobs غير محددة وتخضع للتغيير بين إصدارات Perl.
يؤدي التعيين إلى typeglob إلى إجراء عملية مستعارة، على سبيل المثال،
*ديك = *ريتشارد;
يؤدي إلى إمكانية الوصول إلى المتغيرات والإجراءات الفرعية والتنسيقات ومقابض الملفات والدليل عبر ملف
يمكن أيضًا الوصول إلى المعرف "richard" عبر المعرف "dick". أذا أردت
الاسم المستعار لمتغير أو روتين فرعي معين فقط، قم بتعيين مرجع بدلاً من ذلك:
*ديك = \$ريتشارد;
مما يجعل $richard و$dick نفس المتغير، لكنه يترك @richard و@dick كما هو
مصفوفات منفصلة. صعبة، إيه؟
هناك فرق بسيط بين العبارات التالية:
*foo = *bar;
*foo = \$bar;
"*foo = *bar" يجعل typeglobs نفسها مترادفة بينما "*foo = \$bar" يجعل
تشير أجزاء SCALAR من نوعين مختلفين إلى نفس القيمة العددية. هذا يعني ذاك
الكود التالي:
شريط $ = 1؛
*foo = \$bar; # اجعل $foo اسمًا مستعارًا لـ $bar
{
شريط $ المحلي = 2؛ # تقييد التغييرات للحظر
طباعة $فو؛ # المطبوعات "1"!
}
سيتم طباعة "1"، لأن $foo يحمل إشارة إلى أصلي $ بار. الذي كان
محشو بـ "local()" والذي سيتم استعادته عند انتهاء الكتلة. لأن
يتم الوصول إلى المتغيرات من خلال typeglob، يمكنك استخدام "*foo = *bar" لإنشاء اسم مستعار
والتي يمكن أن تكون مترجمة. (لكن انتبه إلى أن هذا يعني أنه لا يمكنك الحصول على @foo و
@شريط، الخ.)
ما يجعل كل هذا مهمًا هو أن وحدة المصدر تستخدم الاسم المستعار الشامل مثل
آلية الاستيراد/التصدير. ما إذا كان يمكنك ترجمة المتغير الموجود بشكل صحيح أم لا
يعتمد تصديرها من الوحدة النمطية على كيفية تصديرها:
@EXPORT = qw($FOO); # النموذج المعتاد، لا يمكن ترجمته
@EXPORT = qw(*FOO); # يمكن أن تكون مترجمة
يمكنك حل الحالة الأولى باستخدام الاسم المؤهل بالكامل ($Package::FOO) حيث
أنت بحاجة إلى قيمة محلية، أو عن طريق تجاوزها بقول "*FOO = *Package::FOO" في ملفك
النصي.
يمكن استخدام آلية "*x = \$y" لتمرير وإرجاع المراجع الرخيصة من وإلى
الإجراءات الفرعية إذا كنت لا ترغب في نسخ كل شيء. إنه يعمل فقط عند التعيين إلى
المتغيرات الديناميكية، وليس المفردات.
%some_hash = (); # لا يمكن أن يكون () الخاص بي
*some_hash = fn( \%another_hash);
الجبهة الوطنية الفرعية {
محلي *hashsym = التحول؛
# الآن استخدم٪ hashsym بشكل طبيعي، وأنت
# سيؤثر على %an_hash الخاص بالمتصل
%nhash الخاص بي = (); # افعل ما تريد
إرجاع \%nhash;
}
عند العودة، سيقوم المرجع بالكتابة فوق فتحة التجزئة في جدول الرموز المحدد بواسطة
*some_hash typeglob. هذه طريقة صعبة إلى حد ما لتمرير المراجع بتكلفة زهيدة
عندما لا تريد أن تتذكر إلغاء الإشارة إلى المتغيرات بشكل صريح.
استخدام آخر لجداول الرموز هو صنع كميات قياسية "ثابتة".
*PI = \3.14159265358979;
الآن لا يمكنك تغيير $PI، وهو أمر جيد على الإطلاق. هذا ليس هو نفسه
كإجراء فرعي ثابت، والذي يخضع للتحسين في وقت الترجمة. ثابت
الروتين الفرعي هو نموذج أولي بحيث لا يأخذ أي وسيطات ويعيد تعبيرًا ثابتًا.
راجع perlsub للحصول على تفاصيل حول هذه. إن براغما "الاستخدام الثابت" هي اختصار مناسب لـ
هذه.
يمكنك نطق *foo{PACKAGE} و *foo{NAME} لمعرفة اسم وحزمة الرمز *foo
إدخال الجدول يأتي من. قد يكون هذا مفيدًا في الروتين الفرعي الذي يتم تمريره إلى typeglobs كـ
الحجج:
تحديد نوع_النوع الفرعي {
بلدي $glob = التحول؛
اطبع "لقد أعطيتني"، *{$glob}{PACKAGE},
'::', *{$glob}{NAME}, "\n";
}
ident_typeglob *foo;
ident_typeglob *bar::baz;
هذا يطبع
لقد أعطيتني الرئيسي::foo
لقد أعطيتني شريط::baz
يمكن أيضًا استخدام تدوين *foo{THING} للحصول على مراجع للعناصر الفردية
من *فو. انظر المرجع.
لا يلزم بالضرورة أن تكون التعريفات الروتينية (والإعلانات، في هذا الشأن) كذلك
الموجودة في الحزمة التي يشغلون جدول الرموز الخاص بها. يمكنك تحديد روتين فرعي
خارج حزمته من خلال تأهيل اسم الروتين الفرعي بشكل صريح:
الحزمة الرئيسية
sub Some_package::foo { ... } # &foo محدد في Some_package
هذا مجرد اختصار لمهمة typeglob في وقت الترجمة:
البدء { *Some_package::foo = sub { ... } }
وغير ليس نفس الكتابة:
{
حزمة Some_package؛
فرعي فو {...}
}
في الإصدارين الأولين، يكون نص البرنامج الفرعي معجميًا في الحزمة الرئيسية،
ليس في Some_package. لذلك شيء من هذا القبيل:
الحزمة الرئيسية
$Some_package::name = "فريد";
$main::name = "بارني";
فرعية Some_package::foo {
طباعة "في"، __PACKAGE__، ": \$name هو '$name'\n";
}
Some_package::foo();
مطبوعات:
بشكل رئيسي: $name هو "barney"
عوضا عن:
في Some_package: $name هو "fred"
وهذا أيضًا له آثار على استخدام مؤهل SUPER:: (انظر perlobj).
يبدأ، يونيتشيك، يفحص، INIT END
يتم تنفيذ خمس كتل تعليمات برمجية مسماة بشكل خاص في بداية التشغيل وفي نهايته
برنامج بيرل. هذه هي الكتل "BEGIN" و"UNITCHECK" و"CHECK" و"INIT" و"END".
يمكن أن تكون كتل التعليمات البرمجية هذه مسبوقة بـ "sub" لإضفاء مظهر الروتين الفرعي
(على الرغم من أن هذا لا يعتبر أسلوبًا جيدًا). ينبغي للمرء أن يلاحظ أن كتل التعليمات البرمجية هذه
لا توجد بالفعل كإجراءات فرعية مسماة (على الرغم من مظهرها). الشيء الذي يعطي
هذه هي الحقيقة التي يمكنك الحصول عليها الأكثر من ذلك من صورة واحدة؟ من كتل التعليمات البرمجية هذه في البرنامج،
وسوف يحصلون الكل تنفيذها في اللحظة المناسبة. لذلك لا يمكنك تنفيذ أي منها
كتل التعليمات البرمجية هذه بالاسم.
يتم تنفيذ كتلة التعليمات البرمجية "BEGIN" في أسرع وقت ممكن، أي لحظة اكتمالها
المحددة، حتى قبل تحليل بقية الملف (أو السلسلة) التي تحتوي على الملف. انت ربما لديك
كتل "BEGIN" متعددة داخل ملف (أو سلسلة تم تقييمها)؛ سوف ينفذون بالترتيب
تعريف. نظرًا لأن كتلة التعليمات البرمجية "BEGIN" يتم تنفيذها على الفور، فيمكنها سحب التعريفات
من الإجراءات الفرعية وما شابه ذلك من الملفات الأخرى في الوقت المناسب لتكون مرئية لبقية التجميع
ووقت التشغيل. بمجرد تشغيل "BEGIN"، يصبح غير محدد على الفور وأي رمز يستخدمه يكون كذلك
عاد إلى تجمع ذاكرة بيرل.
يتم تنفيذ كتلة التعليمات البرمجية "END" في وقت متأخر قدر الإمكان، أي بعد انتهاء لغة Perl
تشغيل البرنامج وقبل خروج المترجم مباشرة، حتى لو كان في حالة خروج
ونتيجة لذلك من يموت () وظيفة. (ولكن ليس إذا كان يتحول إلى برنامج آخر عبر
"exec"، أو أن يتم تفجيرك من الماء بواسطة إشارة - عليك أن تحبس ذلك بنفسك (إذا
يمكنك ذلك).) قد يكون لديك كتل "END" متعددة داخل الملف - سيتم تنفيذها في الاتجاه المعاكس
ترتيب التعريف؛ أي: الوارد أخيرًا يخرج أولاً (LIFO). لا يتم تنفيذ الكتل "END".
عند تشغيل Perl باستخدام رمز التبديل "-c"، أو في حالة فشل الترجمة.
لاحظ أن كتل التعليمات البرمجية "END" موجودة ليس يتم تنفيذه في نهاية السلسلة "eval ()": إن وجد "END"
يتم إنشاء كتل التعليمات البرمجية في سلسلة "eval()"، وسيتم تنفيذها تمامًا مثل أي شيء آخر
كتلة التعليمات البرمجية "END" لتلك الحزمة بترتيب LIFO قبل بدء تشغيل المترجم مباشرةً
خرج.
داخل كتلة التعليمات البرمجية "END"، $؟ يحتوي على القيمة التي سينتقل إليها البرنامج
"مخرج()". يمكنك تعديل $؟ لتغيير قيمة الخروج للبرنامج. احذر من التغيير
$؟ عن طريق الصدفة (على سبيل المثال عن طريق تشغيل شيء ما عبر "النظام").
داخل كتلة "END"، ستكون قيمة "${^GLOBAL_PHASE}" هي "END".
تعتبر كتل التعليمات البرمجية "UNITCHECK" و"CHECK" و"INIT" مفيدة في التقاط الانتقال بين
مرحلة التجميع ومرحلة تنفيذ البرنامج الرئيسي.
يتم تشغيل كتل "UNITCHECK" مباشرة بعد تجميع الوحدة التي حددتها. ال
ملف البرنامج الرئيسي وكل وحدة يتم تحميلها هي وحدات تجميع، كما هو الحال مع سلسلة "التقييم"،
تم تجميع تعليمات برمجية وقت التشغيل باستخدام البنية "(?{ })" في التعبير العادي، واستدعاءات "do FILE"،
"يتطلب ملفًا"، والرمز بعد رمز التبديل "-e" في سطر الأوامر.
لا ترتبط كتل "BEGIN" و"UNITCHECK" بشكل مباشر بمرحلة المترجم.
يمكن إنشاؤها وتنفيذها خلال أي مرحلة.
يتم تشغيل كتل التعليمات البرمجية "التحقق" مباشرة بعد في البداية تنتهي مرحلة ترجمة Perl وقبل
يبدأ وقت التشغيل بترتيب LIFO. يتم استخدام كتل التعليمات البرمجية "التحقق" في مجموعة مترجم Perl
لحفظ الحالة المترجمة للبرنامج.
داخل كتلة "CHECK"، ستكون قيمة "${^GLOBAL_PHASE}" هي "CHECK".
يتم تشغيل كتل "INIT" قبل بدء تنفيذ وقت تشغيل Perl مباشرةً، في "أولًا في أولًا".
خارج" (FIFO) النظام.
داخل كتلة "INIT"، ستكون قيمة "${^GLOBAL_PHASE}" هي "INIT".
الكتل "CHECK" و"INIT" في التعليمات البرمجية المجمعة بواسطة "require" أو السلسلة "do" أو السلسلة "eval"
لن يتم تنفيذها إذا حدثت بعد نهاية مرحلة التجميع الرئيسية؛ باستطاعة
تكون مشكلة في mod_perl والبيئات المستمرة الأخرى التي تستخدم هذه الوظائف
تحميل التعليمات البرمجية في وقت التشغيل.
عند استخدام -n -p يتحول إلى لغة Perl، ويعمل "BEGIN" و"END" تمامًا كما هو الحال في
AWK، كحالة منحلة. يتم تشغيل كلا الكتلتين "BEGIN" و"CHECK" عند استخدام -c
قم بالتبديل للتحقق من بناء الجملة للترجمة فقط، على الرغم من أن الكود الرئيسي الخاص بك ليس كذلك.
تشير startcheck يوضح البرنامج كل شيء، في النهاية:
#!/ البيرة / بن / بيرل
# ابدأ بالفحص
طباعة "10. يتم تشغيل التعليمات البرمجية العادية في وقت التشغيل.\n";
END { طباعة "16. إذن هذه نهاية الحكاية.\n" }
INIT { print " 7. تقوم كتل INIT بتشغيل FIFO قبل وقت التشغيل مباشرة.\n" }
يونيتشيك {
اطبع "4. وبالتالي قبل أي كتل فحص.\n"
}
تحقق من { طباعة " 6. هذا هو السطر السادس.\n" }
print "11. يعمل بالترتيب بالطبع.\n";
BEGIN { طباعة " 1. تقوم كتل BEGIN بتشغيل FIFO أثناء الترجمة.\n" }
END { print "15. اقرأ Perlmod لبقية القصة.\n" }
CHECK { print " 5. التحقق من تشغيل الكتل LIFO بعد كل عملية التحويل البرمجي.\n" }
INIT { طباعة " 8. قم بتشغيل هذا مرة أخرى، باستخدام رمز التبديل -c الخاص بـ Perl.\n" }
print "12. هذا رمز مضاد للتشويش.\n";
END { طباعة "14. تقوم كتل END بتشغيل LIFO في وقت الخروج.\n" }
BEGIN { طباعة " 2. إذن يأتي هذا السطر ثانيًا.\n" }
يونيتشيك {
طباعة " 3. تقوم كتل UNITCHECK بتشغيل LIFO بعد تجميع كل ملف.\n"
}
INIT { طباعة " 9. ستلاحظ الفرق على الفور.\n" }
طباعة "13. يبدو الأمر فقط وكأنه يجب أن يكون مربكًا.\n";
__نهاية__
بيرل فصول دراسية
لا يوجد بناء جملة فئة خاصة في لغة Perl، ولكن قد تعمل الحزمة كفئة إذا تم توفيرها
الإجراءات الفرعية لتكون بمثابة الأساليب. قد تستمد مثل هذه الحزمة أيضًا بعض أساليبها من
فئة (حزمة) أخرى عن طريق سرد اسم (أسماء) الحزمة الأخرى في صفيف @ISA العام الخاص بها
(والتي يجب أن تكون حزمة عالمية وليست معجمية).
لمزيد من المعلومات حول هذا، راجع perlootut وperlobj.
بيرل الأقسام
الوحدة هي مجرد مجموعة من الوظائف ذات الصلة في ملف المكتبة، أي حزمة بيرل مع
نفس اسم الملف. إنه مصمم خصيصًا ليكون قابلاً لإعادة الاستخدام بواسطة وحدات أو وحدات أخرى
البرامج. وقد تفعل ذلك من خلال توفير آلية لتصدير بعض رموزها إلى
جدول الرموز لأي حزمة تستخدمه، أو قد يعمل كتعريف للفئة و
جعل دلالاتها متاحة ضمنيًا من خلال استدعاءات الأساليب على الفصل وكائناته،
دون تصدير أي شيء بشكل صريح. أو يمكنها أن تفعل القليل من الاثنين معًا.
على سبيل المثال، لبدء وحدة نمطية تقليدية غير تابعة لـ OO تسمى Some::Module، قم بإنشاء ملف
تسمى بعض/الوحدة.pm وابدأ بهذا القالب:
حزمة بعض::الوحدة النمطية؛ # يفترض Some/Module.pm
استخدام صارم
استخدام التحذيرات
ابدأ {
تتطلب المصدر ؛
# قم بتعيين الإصدار للتحقق من الإصدار
نسختنا $ = 1.00؛
# وراثة من المصدر لتصدير الوظائف والمتغيرات
لديناISA = qw (مصدر) ؛
# الوظائف والمتغيرات التي يتم تصديرها بشكل افتراضي
@EXPORT الخاص بنا = qw(func1 func2);
# الوظائف والمتغيرات التي يمكن تصديرها اختياريا
@EXPORT_OK = qw($Var1 %Hashit func3);
}
# الحزمة العالمية المصدرة تذهب هنا
لدينا $Var1 = '';
% Hashit الخاص بنا = ();
# الحزمة العالمية غير المصدرة تذهب هنا
# (لا يزال من الممكن الوصول إليها باسم $Some::Module::stuff)
@more = ();
أشياءنا $ = '';
# المفردات الخاصة بالملفات توضع هنا، قبل أي وظائف تستخدمها
$priv_var = '';
%secret_hash الخاص بي = ();
# إليك وظيفة الملف الخاص كإغلاق،
# قابل للاستدعاء كـ $priv_func->();
بلدي $priv_func = الفرعية {
};
# جعل جميع وظائفك، سواء تم تصديرها أم لا؛
# تذكر أن تضع شيئًا مثيرًا للاهتمام في بذرة {}.
الوظيفة الفرعية 1 {...}
الوظيفة الفرعية 2 {...}
# لم يتم تصدير هذا، ولكن يمكن استدعاؤه مباشرة
# كبعض::Module::func3()
الوظيفة الفرعية 3 {...}
END {... } # رمز تنظيف الوحدة هنا (المدمر العالمي)
1؛ # لا تنس إرجاع القيمة الحقيقية من الملف
ثم انتقل إلى إعلان واستخدام المتغيرات الخاصة بك في الوظائف دون أي مؤهلات. يرى
Exporter وperlmodlib للحصول على تفاصيل حول مشكلات الميكانيكا والأسلوب في إنشاء الوحدة.
يتم تضمين وحدات Perl في برنامجك بالقول
استخدام الوحدة؛
or
استخدام قائمة الوحدة النمطية؛
هذا يعادل بالضبط
البدء { يتطلب "Module.pm"؛ "الوحدة النمطية"->استيراد؛ }
or
البدء { يتطلب "Module.pm"؛ "الوحدة النمطية"->استيراد(قائمة); }
كحالة خاصة
استخدام الوحدة النمطية ()؛
يعادل بالضبط
البدء { يتطلب "Module.pm"؛ }
جميع ملفات وحدة Perl لها الامتداد .مساء. يفترض عامل التشغيل "الاستخدام" هذا الأمر
لا داعي للتوضيح "الوحدة. مساء" في علامات الاقتباس. وهذا يساعد أيضًا في التمييز بين الجديد
وحدات من القديم .PL .ph ملفات. تتم أيضًا كتابة أسماء الوحدات بالأحرف الكبيرة ما لم تكن كذلك
العمل كبراغماتية؛ البراغما هي في الواقع توجيهات للمترجم، وهي كذلك في بعض الأحيان
تسمى "الوحدات البراغماتية" (أو حتى "البراغماتية" إذا كنت كلاسيكيًا).
البيانين:
تتطلب SomeModule؛
تتطلب "SomeModule.pm"؛
تختلف عن بعضها البعض بطريقتين. في الحالة الأولى، أي نقطتين مزدوجتين في الوحدة
الاسم، مثل "Some::Module"، يتم ترجمته إلى فاصل دليل النظام الخاص بك،
عادة "/". أما الحالة الثانية فلا يجب تحديدها حرفيًا. ال
الفرق الآخر هو أن رؤية الأدلة "المطلوبة" الأولى في المترجم الذي يستخدم of
تدوين الكائن غير المباشر الذي يتضمن "SomeModule"، كما في "$ob = purge SomeModule"، هو
استدعاءات الأسلوب، وليس استدعاءات الوظائف. (نعم، هذا يمكن أن يحدث فرقًا حقًا.)
نظرًا لأن عبارة "الاستخدام" تتضمن كتلة "BEGIN"، فإن استيراد الدلالات يحدث على النحو التالي:
بمجرد تجميع عبارة "الاستخدام"، قبل تجميع بقية الملف. هذا هو
كيف يمكنها أن تعمل كآلية براغما، وأيضًا كيف يمكن للوحدات أن تعلن
الإجراءات الفرعية التي تكون مرئية بعد ذلك كقائمة أو عوامل تشغيل أحادية لبقية التيار
ملف. لن ينجح هذا إذا استخدمت "require" بدلاً من "use". مع "تتطلب" يمكنك ذلك
الدخول في هذه المشكلة:
تتطلب CWD؛ # جعل Cwd:: يمكن الوصول إليه
$هنا = Cwd::getcwd();
استخدم كود؛ # استيراد الأسماء من Cwd::
$هنا = getcwd();
تتطلب CWD؛ # جعل Cwd:: يمكن الوصول إليه
$هنا = getcwd(); # أُووبس! لا يوجد رئيسي::getcwd()
بشكل عام، يوصى باستخدام "استخدام الوحدة النمطية ()" بدلاً من "يتطلب الوحدة النمطية"، لأنها تحدد
توفر الوحدة في وقت الترجمة، وليس في منتصف تنفيذ البرنامج. ان
سيكون الاستثناء هو إذا حاولت كل وحدتين "استخدام" بعضهما البعض، وتسمى كل منهما أيضًا a
وظيفة من تلك الوحدة الأخرى. في هذه الحالة، من السهل استخدام "require" بدلاً من ذلك.
قد تكون حزم Perl متداخلة داخل أسماء حزم أخرى، حتى نتمكن من الحصول على أسماء حزم
تحتوي "::". ولكن إذا استخدمنا اسم الحزمة هذا مباشرةً كاسم ملف، فسيتم إنشاءه
لأسماء الملفات غير العملية أو المستحيلة على بعض الأنظمة. لذلك، إذا كان اسم الوحدة هو،
قل "Text::Soundex"، فإن تعريفه موجود بالفعل في ملف المكتبة
نص/Soundex.pm.
تحتوي وحدات Perl دائمًا على .مساء الملف، ولكن قد يكون هناك أيضًا ملفات تنفيذية مرتبطة ديناميكيًا
(غالبًا ما تنتهي بـ .وبالتالي) أو تعريفات الروتين الفرعي المحملة تلقائيًا (غالبًا ما تنتهي بـ .AL)
المرتبطة بالوحدة النمطية. إذا كان الأمر كذلك، فستكون هذه شفافة تمامًا لمستخدم الملف
وحدة. إنها مسؤولية .مساء ملف للتحميل (أو الترتيب للتحميل التلقائي) أي
وظائف إضافية. على سبيل المثال، على الرغم من أن وحدة POSIX تقوم بالأمرين معًا
التحميل الديناميكي والتحميل التلقائي، يمكن للمستخدم أن يقول فقط "استخدم POSIX" للحصول على كل شيء.
القيام ب لك وحدة خيوط
يدعم Perl نوعًا من سلاسل الرسائل يُسمى سلاسل المترجم (threads). يمكن لهذه المواضيع
استخدامها صراحة وضمنا.
تعمل الخيوط عن طريق استنساخ شجرة البيانات بحيث لا تتم مشاركة أي بيانات بين المختلفين
الخيوط. يمكن استخدام هذه المواضيع باستخدام وحدة "المواضيع" أو عن طريق القيام بذلك فرع() on
win32 (وهمية فرع() يدعم). عندما يتم استنساخ مؤشر ترابط، يتم استنساخ جميع بيانات Perl، ولكن غير ذلك
لا يمكن استنساخ بيانات بيرل تلقائيًا. بيرل بعد 5.8.0 لديه دعم لـ "CLONE"
روتين فرعي خاص في "CLONE" يمكنك القيام بكل ما تريد القيام به، على سبيل المثال
التعامل مع استنساخ البيانات غير بيرل، إذا لزم الأمر. سيتم استدعاء "CLONE" مرة واحدة كفصل دراسي
طريقة لكل حزمة تم تعريفها (أو ورثتها). سيتم استدعاؤه في
سياق الموضوع الجديد، لذلك يتم إجراء جميع التعديلات في المنطقة الجديدة. استنساخ حاليا
يتم استدعاؤه بدون أي معلمات غير اسم الحزمة المستدعي، ولكن لا ينبغي أن يتم استدعاء التعليمات البرمجية
نفترض أن هذا سيبقى دون تغيير، لأنه من المحتمل أن يكون ذلك في المعلمات الإضافية في المستقبل
سيتم تمريره لإعطاء مزيد من المعلومات حول حالة الاستنساخ.
إذا كنت تريد استنساخ كافة الكائنات، فستحتاج إلى تتبعها لكل حزمة. هذا هو
يتم ذلك ببساطة باستخدام التجزئة و العددية::Util::ضعف().
بيرل بعد 5.8.7 لديه دعم للروتين الفرعي الخاص "CLONE_SKIP". مثل "استنساخ"،
يتم استدعاء "CLONE_SKIP" مرة واحدة لكل حزمة؛ ومع ذلك، يتم استدعاؤه قبل بدء الاستنساخ مباشرة،
وفي سياق الموضوع الأصلي. إذا قامت بإرجاع قيمة حقيقية، فلا توجد كائنات
سيتم استنساخ تلك الفئة؛ أو بالأحرى، سيتم نسخها كقيم غير مباركة وغير محددة. ل
مثال: إذا كان في الأصل إشارتان إلى تجزئة واحدة مباركة، ففي
سيكون هناك مرجعين لقيمة عددية واحدة غير محددة بدلاً من ذلك. هذا
يوفر آلية بسيطة لجعل الوحدة النمطية آمنة؛ فقط أضف "sub CLONE_SKIP { 1
}" في الجزء العلوي من الفئة، وسيتم الآن استدعاء "DESTROY()" مرة واحدة فقط لكل كائن.
بالطبع، إذا كان الخيط الفرعي يحتاج إلى الاستفادة من الكائنات، فهو أكثر تعقيدًا
هناك حاجة إلى النهج.
مثل "CLONE"، يتم استدعاء "CLONE_SKIP" حاليًا بدون أي معلمات غير المستدعي
اسم الحزمة، على الرغم من أن ذلك قد يتغير. وبالمثل، للسماح بالتوسع في المستقبل، و
يجب أن تكون قيمة الإرجاع قيمة واحدة 0 أو 1.
استخدم Perlmod عبر الإنترنت باستخدام خدمات onworks.net