تعد إجراءات Perl الفرعية أيضًا وظائف محددة من قبل المستخدم.
الروتين الفرعي لـ Perl هو جزء منفصل من التعليمات البرمجية يؤدي مهمة محددة، مما قد يقلل من التعليمات البرمجية المتكررة ويجعل البرنامج أسهل في القراءة.
يمكن أن تظهر إجراءات Perl الفرعية في أي مكان في البرنامج، ويكون تنسيق بناء الجملة كما يلي:
روتين فرعي {بيانات؛}
تنسيق بناء الجملة لاستدعاء الروتين الفرعي:
روتين فرعي (قائمة المعلمات) ؛
في الإصدارات أدناه Perl 5.0، طريقة استدعاء الروتين الفرعي هي كما يلي:
& روتين فرعي (قائمة المعلمات)؛
في الإصدار الجديد، على الرغم من أن طريقة الاتصال هذه مدعومة أيضًا، إلا أنه لا يوصى باستخدامها.
التالي دعونا نلقي نظرة على مثال بسيط:
بتنفيذ البرنامج أعلاه تكون نتيجة الإخراج هي:
مرحبا بالعالم!
يمكن لبرامج Perl الفرعية قبول معلمات متعددة مثل معلمات البرامج الفرعية الأخرى التي يتم تمييزها بالمصفوفة الخاصة @_.
ولذلك، فإن المعلمة الأولى للروتين الفرعي هي $_[0]، والمعلمة الثانية هي $_[1]، وهكذا.
بغض النظر عما إذا كانت المعلمات عددية أو مصفوفة، عندما يقوم المستخدم بتمرير المعلمات إلى الروتين الفرعي، فإن لغة Perl تستدعيها حسب المرجع افتراضيًا.
بتنفيذ البرنامج أعلاه تكون نتيجة الإخراج هي:
المعلمات التي تم تمريرها هي: 10 20 30 قيمة المعلمة الأولى هي: 10 متوسط قيمة المعلمات التي تم تمريرها هي: 20
يمكن للمستخدمين تغيير قيمة المعلمة الفعلية المقابلة عن طريق تغيير القيمة في المصفوفة @_.
بما أن المتغير @_ عبارة عن مصفوفة، فيمكن تمرير قائمة إلى الروتين الفرعي.
لكن إذا أردنا تمرير معلمات عددية ومصفوفة، فسنحتاج إلى وضع القائمة على المعلمة الأخيرة، كما هو موضح أدناه:
يجمع البرنامج أعلاه بين العدديات والمصفوفات، والإخراج هو:
القائمة هي: 10 1 2 3 4
يمكننا تمرير مصفوفات وتجزئات متعددة إلى الروتين الفرعي، ولكن عند تمرير مصفوفات وتجزئات متعددة، سيتم فقدان الهويات المستقلة. لذلك نحن بحاجة إلى استخدام المراجع (سيتم تقديمها في الفصل التالي) للتمرير.
عندما يتم تمرير جدول التجزئة إلى الروتين الفرعي، يتم نسخه إلى @_ ويتم توسيع جدول التجزئة إلى قائمة مجموعات المفاتيح/القيم.
نتيجة الإخراج لتنفيذ البرنامج أعلاه هي:
العمر: 3 الاسم: كوديرتو
يمكن أن تقوم الإجراءات الفرعية بإرجاع قيم الوظائف باستخدام بيان الإرجاع تمامًا كما هو الحال في لغات البرمجة الأخرى.
إذا لم يتم استخدام عبارة الإرجاع، فسيتم استخدام السطر الأخير من الروتين الفرعي كقيمة الإرجاع.
نتيجة الإخراج لتنفيذ البرنامج أعلاه هي:
3
يمكننا إرجاع كميات قياسية ومصفوفات وتجزئة في الإجراءات الفرعية، ولكن عند إرجاع مصفوفات وتجزئة متعددة، سيتم فقدان الهويات المستقلة. لذلك نحن بحاجة إلى استخدام المراجع (المقدمة في الفصل التالي) لإرجاع صفائف ووظائف متعددة.
بشكل افتراضي، كافة المتغيرات في لغة Perl هي متغيرات عامة، مما يعني أنه يمكن استدعاء المتغيرات في أي مكان في البرنامج.
إذا أردنا تعيين متغير خاص، يمكننا استخدام عامل التشغيل الخاص بي لتعيينه.
يتم استخدام عامل التشغيل الخاص بي لإنشاء متغيرات ذات نطاق معجمي. تظل المتغيرات التي تم إنشاؤها بواسطة عامل التشغيل الخاص بي موجودة من بداية الإعلان حتى نهاية النطاق المغلق.
يشير النطاق المغلق إلى المنطقة الموجودة داخل زوج من الأقواس المتعرجة أو ملف أو سلسلة if أو while أو foreach أو eval.
يوضح المثال التالي كيفية الإعلان عن متغير خاص واحد أو أكثر:
sub somefunc { متغير $ الخاص بي # $ المتغير غير مرئي خارج الطريقة somefunc() my ($another, @an_array, %a_hash); # الإعلان عن متغيرات متعددة في نفس الوقت}
نتيجة الإخراج لتنفيذ البرنامج أعلاه هي:
سلسلة داخل الوظيفة: مرحبًا، Codercto! سلسلة خارج الوظيفة: مرحبًا بالعالم!
يمكننا استخدام المحلي لتوفير قيم مؤقتة للمتغيرات العامة وإرجاع القيم الأصلية بعد الخروج من النطاق.
المتغيرات المعرفة بواسطة محلي غير موجودة في البرنامج الرئيسي، ولكنها موجودة في البرنامج الفرعي والبرامج الفرعية التي يطلق عليها البرنامج الفرعي. يمكنك تعيين قيمة له عند تعريفه، مثل:
نتيجة الإخراج لتنفيذ البرنامج أعلاه هي:
قيمة السلسلة ضمن وظيفة PrintMe: Hello, Codercto!PrintCodercto قيمة السلسلة داخل الوظيفة: Hello, Codercto!PrintHello قيمة السلسلة داخل الوظيفة: Hello, World! قيمة السلسلة خارج الوظيفة: Hello, World!
وظيفة عامل الحالة مشابهة للمعدل الثابت في لغة C. الكلمة الأساسية للحالة تجعل المتغيرات المحلية ثابتة.
تعد الحالة أيضًا متغيرًا معجميًا، لذا فهي صالحة فقط في النطاق المعجمي الذي تم تعريف المتغير فيه، على سبيل المثال:
نتيجة الإخراج لتنفيذ البرنامج أعلاه هي:
قيمة العداد هي: 0 عداد القيمة هي: 1 عداد القيمة هي: 2 عداد القيمة هي: 3 عداد القيمة هي: 4
ملاحظة 1: يمكن للحالة فقط إنشاء متغيرات يكون نطاقها المغلق داخل الروتين الفرعي.
ملاحظة 2: تم تقديم الحالة من Perl 5.9.4، لذا يجب إضافة use قبل الاستخدام.
الملاحظة 3: يمكن للحالة أن تعلن عن الكميات، والمصفوفات، والتجزئة. لكن لا يمكن تهيئة المصفوفات والتجزئة عند الإعلان عنها (على الأقل ليس في Perl 5.14).
أثناء عملية استدعاء الروتين الفرعي، سيتم إرجاع أنواع مختلفة من القيم وفقًا للسياق، على سبيل المثال، يقوم الروتين الفرعي localtime() التالي بإرجاع سلسلة في سياق عددي وقائمة في سياق القائمة:
نتيجة الإخراج لتنفيذ البرنامج أعلاه هي:
الأحد 12 يونيو 15:58:09 20162106-6-12 15:58:9