Latest web development tutorials

Perl subroutine (fungsi)

Perl subroutine yang fungsi yang ditetapkan pengguna.

Perl subroutine yang sepotong kode untuk melakukan pemisahan tugas-tugas khusus, dapat membuat untuk mengurangi duplikasi kode dan membuat program mudah dibaca.

Perl subroutine dapat muncul di mana saja dalam program ini, sintaksnya adalah sebagai berikut:

sub subroutine{
   statements;
}

Subroutine sintaks panggilan:

subroutine( 参数列表 );

Perl 5.0 di berikut versi subroutine panggilan sebagai berikut:

&subroutine( 参数列表 );

Pada versi baru, meskipun mendukung metode panggilan, tapi tidak direkomendasikan.

Selanjutnya kita lihat adalah contoh sederhana:

#!/usr/bin/perl

# 函数定义
sub Hello{
   print "Hello, World!\n";
}

# 函数调用
Hello();

Program di atas, output adalah:

Hello, World!

Melewati parameter untuk subrutin

Perl subroutine dapat menerima beberapa parameter dan pemrograman lain, menggunakan array @_ parameter subrutin khusus ditunjukkan.

Dengan demikian, subroutine argumen pertama adalah $ _ [0], argumen kedua adalah $ _ [1], dan sebagainya.

Apakah parameter skalar atau array jenis, pengguna parameter dilewatkan ke subroutine, perl default dengan referensi memanggil mereka.

#!/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);

Program di atas, output adalah:

传入的参数为 : 10 20 30
第一个参数值为 : 10
传入参数的平均值为 : 20

pengguna dapat mengubah nilai parameter yang sebenarnya sesuai dengan mengubah nilai-nilai dalam array @_.

Diteruskan ke daftar subroutine

Karena variabel @_ adalah array, sehingga dapat melewati daftar untuk subrutin.

Tetapi jika kita harus lulus skalar dan array yang parameter, Anda perlu untuk daftar di parameter terakhir, sebagai berikut:

#!/usr/bin/perl

# 定义函数
sub PrintList{
   my @list = @_;
   print "列表为 : @list\n";
}
$a = 10;
@b = (1, 2, 3, 4);

# 列表参数
PrintList($a, @b);

Program di atas akan menggabungkan skalar dan array hasil output:

列表为 : 10 1 2 3 4

Kami bisa lolos ke subprogram beberapa array dan hash, tetapi jika itu berlalu beberapa array dan hash, akan menyebabkan hilangnya identitas independen. Jadi kita perlu menggunakan referensi (bagian berikutnya akan memperkenalkan) untuk lulus.

Hash diteruskan ke subprogram

Ketika tabel hash diteruskan ke subrutin, itu akan disalin ke @_ dalam tabel hash akan memperluas daftar pasangan kunci / nilai.

#!/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);

Output di atas eksekusi program adalah:

age : 3
name : w3big

nilai kembali subroutine

Sebuah subroutine dapat menjadi seperti bahasa pemrograman lain menggunakan pernyataan kembali untuk kembali nilai-nilai.

Jika tidak ada pernyataan kembali, maka baris terakhir dari pernyataan subroutine sebagai nilai kembali.

#!/usr/bin/perl

# 方法定义
sub add_a_b{
   # 不使用 return
   $_[0]+$_[1];  

   # 使用 return
   # return $_[0]+$_[1];  
}
print add_a_b(1, 2)

Output di atas eksekusi program adalah:

3

Subrutin kita dapat kembali skalar, array dan hash, tapi sebagai imbalannya beberapa array dan hash, akan menyebabkan hilangnya identitas independen. Jadi kita perlu menggunakan referensi (bagian berikutnya akan memperkenalkan) untuk kembali beberapa array, dan fungsi.


variabel pribadi subrutin

Secara default, Perl, semua variabel adalah variabel global, yang berarti bahwa variabel dapat dipanggil dari mana saja dalam program ini.

Jika kita perlu mengatur variabel pribadi, menggunakan operatorsaya untuk mengatur.

operatorsaya menciptakan variabel leksikal scoped, variabel dibuat dengan tempat hidup sayadi awal pernyataan sampai akhir lingkup penutupan.

Lingkup mengacu penutupan mungkin di wilayah ini kawat gigi pasangan bisa menjadi sebuah file, juga bisa menjadi jika, sementara, untuk, foreach, eval tali.

Contoh berikut menunjukkan bagaimana cara mendeklarasikan satu atau lebih variabel pribadi:

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";

Output di atas eksekusi program adalah:

函数内字符串:Hello, w3big!
函数外字符串:Hello, World!

variabel tugas sementara

Kita dapat menggunakan nilai-nilai lokal sementara untuk variabel global, ruang lingkup nilai asli setelah keluar juga kembali.

variabel lokal didefinisikan dalam program utama tidak ada, tapi ada di subroutine dan panggilan subroutine subroutine. Ketika Anda menentukan dapat memberikan nilai, seperti:

#!/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";

Output di atas eksekusi program adalah:

PrintMe 函数内字符串值:Hello, w3big!
Printw3big 函数内字符串值:Hello, w3big!
PrintHello 函数内字符串值:Hello, World!
函数外部字符串值:Hello, World!

variabel statis

operator negara fungsinya hampir sama dengan pengubah statis C, kata kunci negara akan menjadi variabel lokal persisten.

negara variabel juga leksikal, hanya definisi variabel domain leksikal berlaku, misalnya:

#!/usr/bin/perl

use feature 'state';

sub PrintCount{
   state $count = 0; # 初始化变量

   print "counter 值为:$count\n";
   $count++;
}

for (1..5){
   PrintCount();
}

Output di atas eksekusi program adalah:

counter 值为:0
counter 值为:1
counter 值为:2
counter 值为:3
counter 值为:4

Catatan 1: negara hanya dapat membuat variabel tertutup scoped dalam subrutin.

Catatan 2: negara diperkenalkan dari Perl 5.9.4, itu harus ditambahkan sebelum digunakan untuk digunakan.

Catatan 3: Negara dapat menyatakan skalar, array, hash. Tapi ketika mendeklarasikan array dan hash, Anda tidak dapat menginisialisasi itu (setidaknya Perl 5.14 tidak didukung).


konteks panggilan subroutine

panggilan subroutine, itu akan kembali ke nilai-nilai dari berbagai jenis tergantung pada konteks, seperti localtime berikut () subroutine dalam konteks skalar mengembalikan string dalam konteks daftar mengembalikan daftar:

#!/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";

Output di atas eksekusi program adalah:

Sun Jun 12 15:58:09 2016
2106-6-12 15:58:9