Perl subroutine (ฟังก์ชั่น)
subroutine Perl ที่มีฟังก์ชั่นที่ผู้ใช้กำหนด
Perl subroutine ที่เป็นชิ้นส่วนของรหัสที่จะดำเนินการแยกงานพิเศษก็สามารถทำเพื่อลดความซ้ำซ้อนของรหัสและทำให้โปรแกรมง่ายต่อการอ่าน
Perl subroutine สามารถปรากฏที่ใดก็ได้ในโปรแกรมไวยากรณ์เป็นดังนี้:
sub subroutine{ statements; }
ไวยากรณ์โทร subroutine:
subroutine( 参数列表 );
Perl 5.0 ในรุ่นต่อไปนี้โทร subroutine ดังนี้
&subroutine( 参数列表 );
ในเวอร์ชันใหม่แม้ว่ามันจะสนับสนุนวิธีการโทร แต่ไม่แนะนำให้ใช้
ต่อไปเราจะดูเป็นตัวอย่างง่ายๆ
#!/usr/bin/perl # 函数定义 sub Hello{ print "Hello, World!\n"; } # 函数调用 Hello();
โปรแกรมข้างต้นผลลัพธ์คือ:
Hello, World!
ผ่านพารามิเตอร์เพื่อซับรูทีน
Perl subroutine สามารถยอมรับหลายพารามิเตอร์และการเขียนโปรแกรมอื่น ๆ ที่ใช้อาร์เรย์ @_ พารามิเตอร์ subroutine พิเศษระบุ
ดังนั้นอาร์กิวเมนต์แรก subroutine คือ $ _ [0], อาร์กิวเมนต์ที่สองคือ $ _ [1] และอื่น ๆ
ไม่ว่าจะเป็นพารามิเตอร์เกลาหรืออาร์เรย์ประเภทผู้ใช้ของพารามิเตอร์ส่งผ่านไปยัง subroutine ที่เริ่มต้น Perl โดยอ้างอิงเรียกพวกเขา
#!/usr/bin/perl # 定义求平均值函数 sub Average{ # 获取所有传入的参数 $n = scalar(@_); $sum = 0; foreach $item (@_){ $sum += $item; } $average = $sum / $n; print '传入的参数为 : ',"@_\n"; # 打印整个数组 print "第一个参数值为 : $_[0]\n"; # 打印第一个参数 print "传入参数的平均值为 : $average\n"; # 打印平均值 } # 调用函数 Average(10, 20, 30);
โปรแกรมข้างต้นผลลัพธ์คือ:
传入的参数为 : 10 20 30 第一个参数值为 : 10 传入参数的平均值为 : 20
ผู้ใช้สามารถเปลี่ยนค่าของพารามิเตอร์ที่เกิดขึ้นจริงที่สอดคล้องกันโดยการเปลี่ยนค่าในอาร์เรย์ @_
ส่งผ่านไปยังรายการ subroutine
เนื่องจากตัวแปร @_ เป็นอาร์เรย์จึงสามารถผ่านรายการเพื่อ subroutine
แต่ถ้าเราต้องการที่จะผ่านสเกลาร์และอาเรย์พารามิเตอร์คุณจะต้องแสดงรายการพารามิเตอร์ที่ผ่านมาดังนี้
#!/usr/bin/perl # 定义函数 sub PrintList{ my @list = @_; print "列表为 : @list\n"; } $a = 10; @b = (1, 2, 3, 4); # 列表参数 PrintList($a, @b);
โปรแกรมดังกล่าวจะผสานสเกลาร์และอาเรย์ของผลออก:
列表为 : 10 1 2 3 4
เราสามารถส่งผ่านไปยังโปรแกรมย่อยหลายอาร์เรย์และ hashes แต่ถ้ามันผ่านอาร์เรย์หลายและแฮชจะนำไปสู่การสูญเสียตัวตนที่เป็นอิสระ ดังนั้นเราจึงจำเป็นต้องใช้การอ้างอิง (ส่วนถัดไปจะแนะนำ) ที่จะผ่าน
กัญชาส่งผ่านไปยังโปรแกรมย่อย
เมื่อตารางแฮชถูกส่งไปยัง subroutine ก็จะถูกคัดลอกไป @_ ในตารางแฮชจะได้รับการขยายรายการของคีย์ / คู่ค่า
#!/usr/bin/perl # 方法定义 sub PrintHash{ my (%hash) = @_; foreach my $key ( keys %hash ){ my $value = $hash{$key}; print "$key : $value\n"; } } %hash = ('name' => 'w3big', 'age' => 3); # 传递哈希 PrintHash(%hash);
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
age : 3 name : w3big
ค่าตอบแทน subroutine
subroutine ที่อาจจะเป็นเหมือนการเขียนโปรแกรมภาษาอื่น ๆ ที่ใช้คำสั่งกลับเพื่อกลับค่า
ถ้าไม่มีคำสั่งกลับแล้วบรรทัดสุดท้ายของคำสั่ง subroutine เป็นค่าตอบแทน
#!/usr/bin/perl # 方法定义 sub add_a_b{ # 不使用 return $_[0]+$_[1]; # 使用 return # return $_[0]+$_[1]; } print add_a_b(1, 2)
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
3
subroutine เราสามารถกลับเกลาอาร์เรย์และ hashes แต่ในทางกลับกันหลายอาร์เรย์และ hashes จะนำไปสู่การสูญเสียตัวตนที่เป็นอิสระ ดังนั้นเราจึงจำเป็นต้องใช้การอ้างอิง (ส่วนถัดไปจะแนะนำ) เพื่อกลับอาร์เรย์หลายฟังก์ชั่นและ
ตัวแปร subroutine ส่วนตัว
โดยค่าเริ่มต้น, Perl, ตัวแปรทั้งหมดเป็นตัวแปรทั่วโลกซึ่งหมายความว่าตัวแปรที่สามารถเรียกได้จากทุกที่ในโปรแกรม
ถ้าเราต้องการที่จะตั้งค่าตัวแปรส่วนตัวของฉันใช้ตัวดำเนินการในการตั้งค่า
ผู้ประกอบการของฉันสร้างตัวแปรกำหนดขอบเขต lexically ตัวแปรที่สร้างขึ้นด้วยสถานที่ที่ชีวิตของผมในการเริ่มต้นของคำสั่งจนกว่าจะสิ้นสุดของขอบเขตปิด
ขอบเขตหมายถึงการปิดอาจจะอยู่ในภูมิภาควงเล็บคู่สามารถเป็นไฟล์ยังสามารถเป็นถ้าในขณะที่สำหรับ foreach สตริง EVAL
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีการประกาศหนึ่งหรือมากกว่าหนึ่งตัวแปรส่วนตัว:
sub somefunc { my $variable; # $variable 在方法 somefunc() 外不可见 my ($another, @an_array, %a_hash); # 同时声明多个变量 }
#!/usr/bin/perl # 全局变量 $string = "Hello, World!"; # 函数定义 sub PrintHello{ # PrintHello 函数的私有变量 my $string; $string = "Hello, w3big!"; print "函数内字符串:$string\n"; } # 调用函数 PrintHello(); print "函数外字符串:$string\n";
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
函数内字符串:Hello, w3big! 函数外字符串:Hello, World!
ตัวแปรที่ได้รับมอบหมายชั่วคราว
เราสามารถใช้ค่าชั่วคราวท้องถิ่นสำหรับตัวแปรทั่วโลกขอบเขตของค่าเดิมหลังจากที่ออกเป็นยังกลับ
ตัวแปรท้องถิ่นที่กำหนดไว้ในโปรแกรมหลักไม่ได้อยู่ แต่อยู่ใน subroutine และโทร subroutine subroutine เมื่อคุณกำหนดสามารถให้มันคุ้มค่าเช่น:
#!/usr/bin/perl # 全局变量 $string = "Hello, World!"; sub Printw3big{ # PrintHello 函数私有变量 local $string; $string = "Hello, w3big!"; # 子程序调用的子程序 PrintMe(); print "Printw3big 函数内字符串值:$string\n"; } sub PrintMe{ print "PrintMe 函数内字符串值:$string\n"; } sub PrintHello{ print "PrintHello 函数内字符串值:$string\n"; } # 函数调用 Printw3big(); PrintHello(); print "函数外部字符串值:$string\n";
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
PrintMe 函数内字符串值:Hello, w3big! Printw3big 函数内字符串值:Hello, w3big! PrintHello 函数内字符串值:Hello, World! 函数外部字符串值:Hello, World!
ตัวแปรคงที่
ฟังก์ชั่นผู้ประกอบการรัฐจะคล้ายกับการปรับปรุงแบบคงที่ของ C, คำหลักที่รัฐจะกลายเป็นตัวแปรท้องถิ่นถาวร
รัฐยังตัวแปรศัพท์เฉพาะคำนิยามของโดเมนตัวแปรคำศัพท์ที่ถูกต้องตัวอย่างเช่น:
#!/usr/bin/perl use feature 'state'; sub PrintCount{ state $count = 0; # 初始化变量 print "counter 值为:$count\n"; $count++; } for (1..5){ PrintCount(); }
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
counter 值为:0 counter 值为:1 counter 值为:2 counter 值为:3 counter 值为:4
หมายเหตุ 1: รัฐเท่านั้นที่สามารถสร้างตัวแปรปิดขอบเขตภายใน subroutine
หมายเหตุ 2: รัฐที่เป็นที่รู้จักจาก Perl 5.9.4 จะต้องมีการเพิ่มการใช้งานก่อนที่จะใช้
หมายเหตุ 3: รัฐสามารถประกาศเกลาอาร์เรย์กัญชา แต่เมื่อประกาศอาร์เรย์และ hashes คุณไม่สามารถเริ่มต้นมัน (อย่างน้อย 5.14 Perl ไม่สนับสนุน)
บริบทโทร subroutine
โทร subroutine ก็จะกลับไปเป็นค่าที่แตกต่างกันขึ้นอยู่กับบริบทเช่น localtime ดังต่อไปนี้ () subroutine ในบริบทเกลากลับสตริงในบริบทรายการส่งกลับรายการ:
#!/usr/bin/perl # 标量上下文 my $datestring = localtime( time ); print $datestring; print "\n"; # 列表上下文 ($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time); printf("%d-%d-%d %d:%d:%d",$year+1990,$mon+1,$mday,$hour,$min,$sec); print "\n";
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
Sun Jun 12 15:58:09 2016 2106-6-12 15:58:9