وحدة بيرل

وحدة بيرل [ 1 ] : 278 [ 2 ] : 227 هي مكون منفصل من مكونات البرمجيات للغة برمجة بيرل . من الناحية التقنية، هي مجموعة محددة من الاصطلاحات لاستخدام آلية حزم بيرل التي أصبحت معتمدة عالميًا.
يُعرّف الموديول شفرة المصدر الخاصة به لتكون ضمن حزمة (تمامًا مثل حزمة جافا )، وهي آلية بيرل لتعريف مساحات الأسماء ، مثل CGI أو Net::FTP أو XML::Parser ؛ ويعكس هيكل الملف هيكل مساحة الاسم (على سبيل المثال، شفرة المصدر لـ Net::FTP موجودة في Net/FTP.pm ). علاوة على ذلك، يُعد الموديول في بيرل مكافئًا للفئة عند استخدام البرمجة كائنية التوجه .
تتألف حزمة التوزيع من مجموعة من الوحدات البرمجية، مع وثائقها المصاحبة ، وبرامج البناء ، ومجموعة اختبارات عادةً . يمتلك مجتمع بيرل مكتبة ضخمة من حزم التوزيع المتاحة للبحث والتنزيل عبر CPAN .
تُتيح لغة بيرل أنماط برمجة متنوعة. فمن المرجح أن يجد المطور وحدة برمجية مكتوبة بأسلوب إجرائي (مثل Test::Simple ) أو بأسلوب كائني التوجه (مثل XML::Parser )، وكلاهما يُعتبر صالحًا بنفس القدر وفقًا لوظيفة الوحدة. كما يمكن استخدام الوحدات البرمجية لدمج الدوال ( مثل DBIx::Class ) أو كتعليمات برمجية ( مثل strict.pm ) تُفعّل فور تحميلها. بل ويمكن استخدامها لتغيير بنية اللغة. وعادةً ما يقتصر تأثير وحدات بيرل البرمجية على النطاق الحالي الذي تم تحميلها فيه.
من الشائع أن تحتوي وحدات بيرل على توثيق مُضمّن بتنسيق التوثيق البسيط القديم (POD). لا يفرض هذا التنسيق قيودًا تُذكر على المُؤلّف، فهو مرن بما يكفي لاستخدامه في كتابة المقالات وصفحات الويب وحتى الكتب الكاملة مثل " برمجة بيرل" . على النقيض من ذلك، يُستخدم جافادوك (javadoc) المُخصّص لتوثيق فئات جافا . وبحسب الاصطلاح، يتبع توثيق الوحدات عادةً بنية صفحة دليل يونكس (man page ).
تُعرَّف لغة بيرل من خلال تطبيقها الوحيد (المشار إليه باسم "perl")، وتُضاف إليها (وفي حالات نادرة تُحذف منها) كل إصدار جديد. لهذا السبب، من المهم لمطوري الوحدات البرمجية أن يكونوا على دراية بالميزات التي يستخدمونها والحد الأدنى المطلوب من إصدار بيرل. يتطلب الكود الموجود في هذه الصفحة إصدار بيرل 5.6.0، وهو إصدار يُعتبر قديمًا نوعًا ما الآن.
أمثلة
فيما يلي أمثلة على كتابة عبارة " Hello, World " باستخدام أنماط مختلفة من الوحدات البرمجية. تجدر الإشارة إلى أن الوحدة البرمجية ليست ضرورية في لغة بيرل؛ إذ يمكن تعريف الدوال والبرمجيات واستخدامها في أي مكان. هذا مجرد مثال توضيحي. على عكس لغة جافا حيث يكون استخدام الصنف ضروريًا دائمًا. تُكتب دالة "Hello, World" الحقيقية على النحو التالي:
sub hello { "Hello, world!\n" } print hello ();أو ببساطة مطبوعة في سطر واحد:
اطبع "مرحباً بالعالم!\n" ؛مثال إجرائي
إليكم تطبيق "مرحباً بالعالم" كوحدة برمجية إجرائية مع هدف قابل للتخصيص للتحية، لإضفاء المزيد من التشويق. يتضمن البرنامج أيضاً نصاً برمجياً قصيراً لتوضيح كيفية استخدام الوحدة.
hello_world.pl
#!/usr/bin/env perl # يقوم بتحميل الوحدة واستيراد أي دوال إلى مساحة الاسم الخاصة بنا # (الافتراضي هو "main") التي تصدرها الوحدة. تُصدّر Hello::World # الدالة hello() افتراضيًا. يمكن عادةً التحكم في عمليات التصدير من قِبل المُستدعي. use Hello::World ;print hello (); # يطبع "مرحباً بالعالم!\n" print hello ( "درب التبانة" ); # يطبع "مرحباً، درب التبانة!\n"Hello/World.pm
# "package" هو نطاق الاسم الذي توجد فيه وظائف/بيانات الوحدة. # يحدد اسم الملف إذا كنت ترغب في "استخدامه". # إذا كان الاسم يتكون من أكثر من كلمة، فإنه يقيد موقع الوحدة.حزمة Hello::World ;# بشكل افتراضي، يسمح لك Perl باستخدام المتغيرات دون تعريفها . # قد يكون هذا مناسبًا للبرامج النصية القصيرة والأسطر البرمجية الواحدة. # ولكن في وحدة برمجية أطول، مثل وحدة نمطية، من الحكمة تعريف # متغيراتك لاكتشاف الأخطاء الإملائية وتقييد # إمكانية الوصول إليها بشكل مناسب من خارج الوحدة النمطية. # يجبرك التوجيه البرمجي strict على تعريف متغيراتك. use strict ; # وبالمثل، لا يُصدر Perl معظم تحذيرات المُصرّف أو وقت التشغيل بشكل افتراضي. # عادةً ما تجد البرامج النصية الأكثر تعقيدًا، مثل معظم الوحدات النمطية، هذه التحذيرات مفيدة جدًا # لتصحيح الأخطاء. يُفعّل التوجيه البرمجي warnings التحذيرات الاختيارية. use warnings ; # يتم تخزين رقم إصدار الوحدة النمطية في $ModuleName::VERSION؛ وتعتمد بعض # أشكال الأمر "use" المدمج على تعريف هذا المتغير.$ VERSION = '1.00' ;# يرث من وحدة "Exporter" التي تتولى تصدير الدوال. # تستخدم معظم الوحدات الإجرائية هذه الوحدة.استخدم القاعدة 'Exporter' ؛# عند استدعاء الوحدة، يتم تصدير الدالة "hello" افتراضيًا إلى # مساحة اسم الكود المستخدم.our @EXPORT = qw(hello) ;# تشير الأسطر التي تبدأ بعلامة يساوي إلى توثيق POD المضمن. # تنتهي أقسام POD بتوجيه =cut، ويمكن دمجها بحرية تقريبًا مع التعليمات البرمجية العادية.=الاسم الأولمرحباً بالعالم - تغليف لرسالة إخراج شائعة=head1 ملخص استخدم Hello::World؛ اطبع hello()؛ اطبع hello("Milky Way")؛=head1 الوصفهذه وحدة إجرائية تعطيك رسالة "مرحباً بالعالم!" الشهيرة، وهي قابلة للتخصيص أيضاً!=وظائف head2يتم تصدير الوظائف التالية افتراضياً=head3 مرحباً اطبع hello(); اطبع hello($target);يُعيد هذا الأمر التحية الشهيرة. إذا تم تحديد C<$target> فسيتم استخدامه، وإلا فإن "world" هو هدف تحيتك.=ut# تعريف الدالة hello().sub hello { my $target = shift ; $target = 'world' unless defined $target ; return "Hello, $target!\n" ; }=الرأس1 المؤلفجو هاكر <joe@joehacker.org>=ut# يجب أن تنتهي وحدة Perl بقيمة صحيحة، وإلا فسيتم اعتبارها غير محملة. # عادةً ما تكون هذه القيمة 1، على الرغم من أنها يمكن أن تكون أي قيمة صحيحة. # يمكن أن تنتهي الوحدة بقيمة خاطئة للإشارة إلى الفشل، ولكن # نادرًا ما يُستخدم هذا، وبدلاً من ذلك سيتم إنهاء البرنامج بـ die() (الخروج مع وجود خطأ). 1 ;بما أن ملف Hello/World.pm غير موجود في مسار @INC الخاص بك، يجب عليك تحديد . في سطر الأوامر لتشغيل المثال أعلاه:
perl -I. hello_world.pl
مثال على البرمجة الكائنية
إليك مثال على نفس الشيء مُنفَّذ بأسلوب البرمجة الكائنية. تكمن ميزة وحدة البرمجة الكائنية في إمكانية تهيئة كل كائن بشكل مستقل عن الكائنات الأخرى.
hello_world.pl
معروف!/usr/bin/env perlاستخدم Hello::World ؛ my $hello = Hello::World- > new ؛ $hello- > print ؛ # يطبع "Hello, world!\n" $hello- > target ( "Milky Way" )؛ $hello- > print ؛ # يطبع "Hello, Milky Way!\n"my $greeting = Hello::World- > new ( target => "Pittsburgh" ); $greeting- > print ; # يطبع "Hello, Pittsburgh!\n" $hello- > print ; # لا يزال يطبع "Hello, Milky Way!\n"Hello/World.pm
# في لغة بيرل، لا يوجد تعريف خاص لـ "الفئة". مساحة الاسم هي فئة. package Hello::World ;استخدم الوضع الصارم ؛ استخدم التحذيرات ؛ $ VERSION = "1.00" ؛=head1 الاسم: Hello::World - تغليف لرسالة إخراج شائعة =head1 الملخص: use Hello::World; my $hello = Hello::World->new(); $hello->print; =head1 الوصف: هذه مكتبة كائنية التوجه يمكنها طباعة رسالة "HW" الشهيرة. =head2 الطرق =head3 new my $hello = Hello::World->new(); my $hello = Hello::World->new( target => $target ); يُنشئ كائنًا يحتوي على رسالة ترحيب. إذا تم تمرير C<$target>، فسيتم تمريره إلى C<< $hello->target >>. =cut # يُسمى مُنشئ الكائن new() اصطلاحًا. يمكن لأي # طريقة إنشاء كائن ويمكنك إنشاء العدد الذي تريده. sub new { my ( $class , %args ) = @_ ; my $self = bless ({}, $class ); my $target = exists $args { target } ? $args { target } : "world" ; $self -> { target } = $target ; return $self ; } =head3 target my $target = $hello->target; $hello->target($target); يحصل على الهدف الحالي لرسالتنا ويضبطه. =cut sub target { my $self = shift ; if ( @_ ) { my $target = shift ; $self -> { target } = $target ; }return $self -> { target }; } =head3 to_string my $greeting = $hello->to_string; تُرجع $greeting كسلسلة نصية =cut sub to_string { my $self = shift ; return "Hello, $self->{target}!" ; } =head3 print $hello->print; تُخرج التحية إلى STDOUT =cut sub print { my $self = shift ; print $self -> to_string (), "\n" ; } =head1 AUTHOR Joe Hacker <joe@joehacker.org> =cut 1 ;حزم ومساحات أسماء بيرل
يحتوي برنامج Perl قيد التشغيل على مساحة اسم مدمجة تُسمى " main"، وهي الاسم الافتراضي. على سبيل المثال، Sub1يمكن استدعاء روتين فرعي يُسمى باسم Sub1()أو main::Sub1(). عند استخدام متغير، يُوضع الرمز المناسب أمام مساحة الاسم؛ لذا $var1يمكن الإشارة إلى متغير عددي يُسمى أيضًا باسم $main::var1، أو حتى $::var1. يمكن إنشاء مساحات أسماء أخرى في أي وقت.
package Namespace1 ; $var1 = 1 ; # تم إنشاؤه في مساحة الاسم Namespace1، والتي يتم إنشاؤها أيضًا إذا لم تكن موجودة مسبقًا $ var2 = 2 ; # تم إنشاؤه أيضًا في مساحة الاسم هذه؛ مطلوب إذا تم تطبيق use strict my $var3 = 3 ; # نطاق معجمي my-declared - ليس في أي مساحة اسم، ولا حتى main$ Namespace2:: var1 = 10 ; # تم إنشاؤه في مساحة الاسم Namespace2، ويتم إنشاؤه أيضًا إذا لم يكن موجودًا مسبقًا $ Namespace2:: var2 = 20 ; # تم إنشاؤه أيضًا في مساحة الاسم my $ Namespace2:: var3 = 30 ; # خطأ في الترجمة: لا يمكن أن تنتمي المتغيرات المُعلنة بواسطة my إلى حزمةتُطبق تعريفات الحزمة نطاق الحزمة حتى تعريف الحزمة التالي أو نهاية الكتلة التي تم فيها التعريف.
our $mainVar = 'a' ; package Sp1 ; our $sp1aVar = 'aa' ; print "$main::mainVar\t$sp1aVar\n" ; # ملاحظة: mainVar يحتاج إلى تحديد package Sp2 ; our $sp2aVar = 'aaa' ; print "$main::mainVar\t$Sp1::sp1aVar\t$sp2aVar\n" ; # ملاحظة: mainVar و sp1aVar يحتاجان إلى تحديد package main ; print "$mainVar\t$Sp1::sp1aVar\t$Sp2::sp2aVar\n" ; # ملاحظة: sp1aVar و sp2aVar يحتاجان إلى تحديد package$mainVar = 'b' ; { # ملاحظة: لا يزال بالإمكان الوصول إلى الحزم ومتغيرات الحزم التي تم إنشاؤها مسبقًا package Sp1 ; our $sp1bVar = 'bb' ; print "$main::mainVar\t$sp1aVar\t$sp1bVar\n" ; # ملاحظة: يجب تحديد mainVar { package Sp2 ; our $sp2bVar = 'bbb' ; print "$main::mainVar\t$Sp1::sp1aVar$Sp1::sp1bVar\t$sp2aVar$sp2bVar\n" ; } # ملاحظة: يجب تحديد mainVar و sp1...Var print "$main::mainVar\t$sp1bVar$sp1aVar\t$Sp2::sp2bVar$Sp2::sp2aVar\n" ; } # ملاحظة: يتم تطبيق الحزمة Sp1 افتراضيًا # يتم تطبيق الحزمة الرئيسية مرة أخرى افتراضيًا; جميع متغيرات الحزمة لا تزال قابلة للوصول طالما أن الطباعة المؤهلة هي "$mainVar\t$Sp1::sp1aVar$Sp2::sp2bVar\n" ؛الحزم والوحدات النمطية
عادةً ما تُربط مساحات الأسماء بالوحدات البرمجية؛ عمليًا، توجد عادةً مساحة اسم واحدة لكل وحدة برمجية والعكس صحيح، لكن هذا ليس شرطًا أساسيًا في اللغة. على سبيل المثال، تحتوي الوحدة البرمجية "القياسية" CGI.pm على التصريح التالي في بدايتها:
حزمة CGI ؛عادةً ما يتم استدعاء هذه الوحدة ووظائفها على النحو التالي:
استخدم CGI ( ':standard' ); # يستورد العديد من الدوال، بما في ذلك b() ... اطبع b ( 'Hello, world' ); # يُخرج <b>Hello, world</b>يمكن إضافة روتين فرعي "مفقود" من مساحة اسم البرنامج المستخدم.
sub CGI ::bi { # تعريف مساحة الاسم المستهدفة (CGI) واسم الفرع (bi) return b ( i ( $_ [ 0 ])); }وتم استدعاؤه كما يلي:
print CGI:: bi ( 'Hello, world' ); # المخرجات <b><i>Hello, world</i></b>مع ذلك، ورغم إمكانية ذلك تقنياً، إلا أنه يُعدّ ممارسة برمجية مشكوكاً فيها. يمكنك ببساطة تعريف الإجراء الفرعي في نطاق الاسم المُستدعي، واستدعائه من ذلك النطاق.
انظر أيضاً
مراجع
- ↑ وول، لاري؛ شوارتز، راندال؛ كريستيانسن، توم (1996). برمجة بيرل . أورايلي وشركاؤه. ISBN 978-1-5659-2149-8تم الاطلاع عليه بتاريخ 21 ديسمبر 2025 .
- ↑ ماكميلان، مايكل (1998). بيرل من الصفر . أوزبورن ماكجرو هيل. ISBN 978-0-0788-2404-3تم الاطلاع عليه بتاريخ 21 ديسمبر 2025 .
روابط خارجية
- نمطية التصميم
- بيرل
