Perlサブルーチン(関数)
ユーザー定義関数であるPerlサブルーチン。
特殊なタスクの分離を実行するためのコードの一部であるPerlサブルーチンは、それがコードの重複を削減し、読みプログラムを容易にするために行うことができます。
次のようにプログラムのどこにでも現れることができるPerlサブルーチンは、構文は次のとおりです。
sub subroutine{ statements; }
サブルーチン呼び出し構文:
subroutine( 参数列表 );
次のバージョンのサブルーチンコールでのPerl 5.0次のように:
&subroutine( 参数列表 );
新バージョンでは、callメソッドをサポートしていますが、推奨されていないが。
次に、私たちは見て簡単な例であります:
#!/usr/bin/perl # 函数定义 sub Hello{ print "Hello, World!\n"; } # 函数调用 Hello();
上記のプログラムは、出力は次のようになります。
Hello, World!
サブルーチンへのパラメータの受け渡し
Perlサブルーチンは、複数のパラメータおよび他のプログラミングを受け入れる示した特殊な配列@_サブルーチンパラメータを使用することができます。
したがって、サブルーチンの最初の引数は、[0]、第二引数は、というように、[1] _ $で、$ _です。
パラメータは、スカラまたは配列タイプであるかどうかは、サブルーチンに渡されたパラメータのユーザは、参照することにより、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
ユーザは、配列@_の値を変更することで対応する実パラメータの値を変更することができます。
サブルーチンリストに渡さ
@_変数が配列であるので、サブルーチンにリストを渡すことができるように。
私たちは、スカラと配列パラメータを渡す必要がある場合は、次のようしかし、あなたは、最後のパラメータにリストする必要があります。
#!/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
我々は、サブプログラムの複数の配列やハッシュに渡すことができますが、それは、複数の配列やハッシュを渡された場合、独立したアイデンティティの喪失につながります。 だから我々は渡すために(次のセクションでは、紹介します)の参照を使用する必要があります。
ハッシュは、サブプログラムに渡されます
ハッシュテーブルは、サブルーチンに渡されると、それはハッシュテーブルに@_にコピーされるキー/値のペアのリストを展開することです。
#!/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
サブルーチンの戻り値
サブルーチンは値を返すreturnステートメントを使用し、他のプログラミング言語のようにすることができます。
ノーリターンステートメント、戻り値としてサブルーチン文の最後の行の場合。
#!/usr/bin/perl # 方法定义 sub add_a_b{ # 不使用 return $_[0]+$_[1]; # 使用 return # return $_[0]+$_[1]; } print add_a_b(1, 2)
上記プログラム実行出力は、次のとおりです。
3
サブルーチン我々は、スカラー、配列やハッシュを返すことができますが、リターンで複数の配列とハッシュは、独立したアイデンティティの喪失につながります。 だから我々は、参照(次のセクションでは、ご紹介します)複数の配列を返すために、関数を使用する必要があります。
サブルーチンプライベート変数
デフォルトでは、Perlは、すべての変数は、変数がプログラム内のどこからでも呼び出すことができることを意味し、グローバル変数です。
我々はプライベート変数を設定する必要がある場合は、設定することが私の演算子を使用します。
私のオペレータはレキシカルスコープの変数、クロージング・スコープの終わりまで文の冒頭で私の生存の場所で作成した変数を作成します。
スコープは、領域がペアをファイルすることができますブレースでも、もしながら、ために、foreachの、evalを文字列にすることができ、かもしれ閉鎖を指します。
次の例では、1つ以上のプライベート変数を宣言する方法を示しています。
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!
一時的な割り当て変数
私たちは、グローバル変数のローカル一時的な値を使用することができ、終了後に元の値の範囲は、バックもあります。
メインプログラムで定義されたローカル変数が存在するが、サブルーチンサブルーチンサブルーチンコールに存在しません。 次のような、これに値を与えることができます定義する場合:
#!/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のstatic修飾子と似ています。
状態もレキシカル変数、語彙の可変ドメインの唯一の定義は、例えば、有効です。
#!/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:状態はサブルーチンの内部に閉じたスコープの変数を作成することができます。
注2:状態はPerlの5.9.4から導入され、それを使用するには、使用する前に追加する必要があります。
注3:状態は、スカラー、配列、ハッシュを宣言することができます。 配列やハッシュを宣言する場合しかし、あなたは(少なくともPerlの5.14がサポートされていません)、それを初期化できません。
サブルーチンコールコンテキスト
サブルーチンコールは、そのようなスカラーコンテキストで次のlocaltime()サブルーチンとして、コンテキストに応じて異なる型の値に戻りますリストコンテキストで文字列がリストを返す返されます。
#!/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