รูทีนย่อย Perl ยังเป็นฟังก์ชันที่ผู้ใช้กำหนดเอง
รูทีนย่อย Perl คือโค้ดที่แยกออกมาเพื่อทำงานเฉพาะเจาะจง ซึ่งสามารถลดโค้ดที่ซ้ำกัน และทำให้โปรแกรมอ่านง่ายขึ้น
รูทีนย่อย Perl สามารถปรากฏได้ทุกที่ในโปรแกรม และรูปแบบไวยากรณ์จะเป็นดังนี้:
รูทีนย่อย { คำสั่ง;}
รูปแบบไวยากรณ์สำหรับการเรียกรูทีนย่อย:
รูทีนย่อย (รายการพารามิเตอร์);
ในเวอร์ชันที่ต่ำกว่า Perl 5.0 วิธีการเรียกรูทีนย่อยจะเป็นดังนี้:
&รูทีนย่อย(รายการพารามิเตอร์);
ในเวอร์ชันใหม่ แม้ว่าจะรองรับวิธีการโทรนี้เช่นกัน แต่ก็ไม่แนะนำให้ใช้
ต่อไปเรามาดูตัวอย่างง่ายๆ:
เมื่อรันโปรแกรมข้างต้น ผลลัพธ์ที่ได้คือ:
สวัสดีชาวโลก!
โปรแกรมย่อย Perl สามารถรับพารามิเตอร์ได้หลายตัวเช่นเดียวกับพารามิเตอร์โปรแกรมย่อยอื่น ๆ ที่ทำเครื่องหมายด้วยอาร์เรย์พิเศษ @_
ดังนั้น พารามิเตอร์แรกของรูทีนย่อยคือ $_[0] พารามิเตอร์ตัวที่สองคือ $_[1] และต่อๆ ไป
ไม่ว่าพารามิเตอร์จะเป็นสเกลาร์หรืออาเรย์ก็ตาม เมื่อผู้ใช้ส่งพารามิเตอร์ไปยังรูทีนย่อย Perl จะเรียกพารามิเตอร์เหล่านั้นโดยการอ้างอิงตามค่าเริ่มต้น
เมื่อรันโปรแกรมข้างต้น ผลลัพธ์ที่ได้คือ:
พารามิเตอร์ที่ส่งผ่านคือ: 10 20 30 ค่าของพารามิเตอร์แรกคือ: 10 ค่าเฉลี่ยของพารามิเตอร์ที่ส่งผ่านคือ: 20
ผู้ใช้สามารถเปลี่ยนค่าของพารามิเตอร์จริงที่เกี่ยวข้องได้โดยการเปลี่ยนค่าในอาร์เรย์ @_
เนื่องจากตัวแปร @_ เป็นอาร์เรย์ จึงสามารถส่งรายการไปยังรูทีนย่อยได้
แต่ถ้าเราจำเป็นต้องส่งผ่านพารามิเตอร์สเกลาร์และอาร์เรย์ เราจำเป็นต้องใส่รายการไว้ที่พารามิเตอร์ตัวสุดท้าย ดังที่แสดงด้านล่าง:
โปรแกรมข้างต้นรวมสเกลาร์และอาร์เรย์เข้าด้วยกัน และผลลัพธ์คือ:
รายการคือ: 10 1 2 3 4
เราสามารถส่งผ่านอาร์เรย์และแฮชหลายรายการไปยังรูทีนย่อยได้ แต่เมื่อส่งผ่านอาร์เรย์และแฮชหลายรายการ ตัวตนที่เป็นอิสระจะหายไป ดังนั้นเราจึงจำเป็นต้องใช้ข้อมูลอ้างอิง (จะแนะนำในบทถัดไป) เพื่อให้ผ่าน
เมื่อตารางแฮชถูกส่งไปยังรูทีนย่อย ตารางแฮชจะถูกคัดลอกไปที่ @_ และตารางแฮชจะถูกขยายไปยังรายการชุดค่าผสมของคีย์/ค่า
ผลลัพธ์ของการทำงานของโปรแกรมข้างต้นคือ:
อายุ: 3ปีชื่อ: codercto
รูทีนย่อยสามารถคืนค่าฟังก์ชันได้โดยใช้คำสั่ง return เช่นเดียวกับในภาษาการเขียนโปรแกรมอื่นๆ
หากไม่ได้ใช้คำสั่ง return บรรทัดสุดท้ายของรูทีนย่อยจะถูกใช้เป็นค่าส่งคืน
ผลลัพธ์ของการทำงานของโปรแกรมข้างต้นคือ:
3
เราสามารถส่งคืนสเกลาร์ อาร์เรย์ และแฮชในรูทีนย่อยได้ แต่เมื่อส่งคืนอาร์เรย์และแฮชหลายรายการ ข้อมูลเฉพาะตัวที่เป็นอิสระจะหายไป ดังนั้นเราจึงจำเป็นต้องใช้การอ้างอิง (แนะนำในบทถัดไป) เพื่อส่งคืนอาร์เรย์และฟังก์ชันหลายรายการ
ตามค่าเริ่มต้น ตัวแปรทั้งหมดใน Perl จะเป็นตัวแปรส่วนกลาง ซึ่งหมายความว่าสามารถเรียกตัวแปรได้ทุกที่ในโปรแกรม
หากเราต้องตั้งค่าตัวแปรส่วนตัว เราสามารถใช้ตัวดำเนินการ ของฉัน ในการตั้งค่าได้
ตัวดำเนินการ ของฉัน ใช้เพื่อสร้างตัวแปรที่กำหนดขอบเขตคำศัพท์ ตัวแปรที่สร้างโดย my survival ตั้งแต่เริ่มต้นการประกาศจนถึงจุดสิ้นสุดของขอบเขตปิด
ขอบเขตแบบปิดหมายถึงพื้นที่ภายในวงเล็บปีกกา ไฟล์ หรือสตริง if, while, for, foreach หรือ eval
ตัวอย่างต่อไปนี้สาธิตวิธีการประกาศตัวแปรส่วนตัวอย่างน้อยหนึ่งรายการ:
sub somefunc { $variable; # $variable ไม่สามารถมองเห็นได้ภายนอกเมธอด somefunc() my ($another, @an_array, %a_hash); # ประกาศตัวแปรหลายตัวในเวลาเดียวกัน}
ผลลัพธ์ของการทำงานของโปรแกรมข้างต้นคือ:
สตริงภายในฟังก์ชัน: สวัสดี Codercto! สตริงภายนอกฟังก์ชัน: สวัสดีชาวโลก!
เราสามารถใช้ local เพื่อจัดเตรียมค่าชั่วคราวสำหรับตัวแปรส่วนกลางและส่งกลับค่าเดิมหลังจากออกจากขอบเขต
ตัวแปรที่กำหนดโดยโลคัลไม่มีอยู่ในโปรแกรมหลัก แต่มีอยู่ในโปรแกรมย่อยและโปรแกรมย่อยที่เรียกโดยโปรแกรมย่อย คุณสามารถกำหนดค่าให้กับมันได้เมื่อทำการกำหนดค่า เช่น:
ผลลัพธ์ของการทำงานของโปรแกรมข้างต้นคือ:
ค่าสตริงภายในฟังก์ชัน PrintMe: สวัสดี Codercto!PrintCodercto ค่าสตริงภายในฟังก์ชัน: สวัสดี Codercto!PrintHello ค่าสตริงภายในฟังก์ชัน: Hello, World! ค่าสตริงภายนอกฟังก์ชัน: Hello, World!
ฟังก์ชันของตัวดำเนินการสถานะจะคล้ายกับตัวแก้ไขแบบคงที่ใน C คีย์เวิร์ด state ทำให้ตัวแปรท้องถิ่นคงอยู่
state ยังเป็นตัวแปรคำศัพท์ ดังนั้นจึงใช้ได้เฉพาะในขอบเขตคำศัพท์ที่มีการกำหนดตัวแปรไว้เท่านั้น ตัวอย่างเช่น:
ผลลัพธ์ของการทำงานของโปรแกรมข้างต้นคือ:
ค่าของตัวนับคือ: 0 ตัวนับ ค่าคือ: 1 ตัวนับ ค่าคือ: 2 ตัวนับ ค่าคือ: 3 ตัวนับ ค่าคือ: 4
หมายเหตุ 1: state สามารถสร้างได้เฉพาะตัวแปรที่มีขอบเขตปิดอยู่ภายในรูทีนย่อย
หมายเหตุ 2: สถานะถูกนำมาใช้จาก Perl 5.9.4 ดังนั้นจึงต้องเพิ่มการใช้งานก่อนใช้งาน
หมายเหตุ 3: state สามารถประกาศสเกลาร์ อาร์เรย์ และแฮชได้ แต่อาร์เรย์และแฮชไม่สามารถเริ่มต้นได้เมื่อมีการประกาศ (อย่างน้อยก็ไม่ใช่ใน Perl 5.14)
ในระหว่างกระบวนการเรียกรูทีนย่อย ค่าประเภทต่างๆ จะถูกส่งกลับตามบริบท ตัวอย่างเช่น รูทีนย่อย localtime() ต่อไปนี้จะส่งคืนสตริงในบริบทสเกลาร์และรายการในบริบทของรายการ:
ผลลัพธ์ของการทำงานของโปรแกรมข้างต้นคือ:
อา. 12 มิ.ย. 15:58:09 25592106-6-12 15:58:9