Perl サブルーチンもユーザー定義関数です。
Perl サブルーチンは、特定のタスクを実行する分離されたコード部分であり、これによりコードの繰り返しが減り、プログラムが読みやすくなります。
Perl サブルーチンはプログラム内のどこにでも出現でき、構文形式は次のとおりです。
サブルーチン{ステートメント;}サブルーチン呼び出しの構文形式:
サブルーチン(パラメータリスト);
Perl 5.0 より前のバージョンでは、サブルーチンを呼び出す方法は次のとおりです。
&サブルーチン(パラメータリスト);
新しいバージョンでは、この呼び出しメソッドもサポートされていますが、その使用は推奨されません。
次に簡単な例を見てみましょう。
上記のプログラムを実行すると、出力結果は次のようになります。
こんにちは世界!
Perl サブプログラムは、他のプログラミングと同様に、複数のパラメーターを受け入れることができます。サブプログラム パラメーターは、特殊な配列 @_ でマークされます。
したがって、サブルーチンの最初のパラメータは $_[0]、2 番目のパラメータは $_[1] などとなります。
パラメーターがスカラーであるか配列であるかに関係なく、ユーザーがパラメーターをサブルーチンに渡すと、Perl はデフォルトでそれらを参照によって呼び出します。
上記のプログラムを実行すると、出力結果は次のようになります。
渡されるパラメータは次のとおりです: 10 20 30 最初のパラメータの値は次のとおりです: 10 渡されるパラメータの平均値は次のとおりです: 20
ユーザーは @_ 配列の値を変更することで、対応する実パラメータの値を変更できます。
@_ 変数は配列であるため、サブルーチンにリストを渡すことができます。
ただし、スカラー パラメーターと配列パラメーターを渡す必要がある場合は、以下に示すように、最後のパラメーターにリストを置く必要があります。
上記のプログラムはスカラーと配列を組み合わせており、出力は次のようになります。
リストは次のとおりです: 10 1 2 3 4
複数の配列とハッシュをサブルーチンに渡すことができますが、複数の配列とハッシュを渡すと、独立したアイデンティティが失われます。したがって、合格するには参照(次の章で紹介します)を使用する必要があります。
ハッシュ テーブルがサブルーチンに渡されると、それが @_ にコピーされ、ハッシュ テーブルはキーと値の組み合わせのリストに展開されます。
上記のプログラムを実行した出力結果は次のとおりです。
年齢:3歳名前:コーデクト
サブルーチンは、他のプログラミング言語と同様に、return ステートメントを使用して関数の値を返すことができます。
return ステートメントが使用されない場合、サブルーチンの最後の行が戻り値として使用されます。
上記のプログラムを実行した出力結果は次のとおりです。
3
サブルーチンでスカラー、配列、ハッシュを返すことができますが、複数の配列とハッシュを返すと、独立したアイデンティティが失われます。したがって、複数の配列と関数を返すには参照 (次の章で紹介) を使用する必要があります。
デフォルトでは、Perl のすべての変数はグローバル変数です。つまり、変数はプログラム内のどこからでも呼び出すことができます。
プライベート変数を設定する必要がある場合は、 my演算子を使用して設定できます。
my演算子は、字句スコープの変数を作成するために使用されます。my によって作成された変数は、宣言の最初から閉じられたスコープの終わりまで存続します。
閉じたスコープは、中括弧のペア、ファイル、または if、while、for、foreach、または eval 文字列内の領域を指します。
次の例は、1 つ以上のプライベート変数を宣言する方法を示しています。
sub somefunc { my $variable; # $variable はメソッド somefunc() my ($another, @an_array, %a_hash); # 複数の変数を同時に宣言します。上記のプログラムを実行した出力結果は次のとおりです。
関数内の文字列: Hello, Codercto! 関数外の文字列: Hello, World!
local を使用してグローバル変数に一時的な値を提供し、スコープを終了した後に元の値を返すことができます。
local で定義された変数は、メインプログラムには存在しませんが、サブプログラムとそのサブプログラムから呼び出されるサブプログラムには存在します。定義時に次のような値を割り当てることができます。
上記のプログラムを実行した出力結果は次のとおりです。
PrintMe 関数内の文字列値: Hello, Codercto!PrintCodercto 関数内の文字列値: Hello, Codercto!PrintHello 関数内の文字列値: Hello, World! 関数外の文字列値: Hello, World!
state 演算子の機能は、C の static 修飾子に似ています。state キーワードにより、ローカル変数が永続化されます。
state は字句変数でもあるため、変数が定義されている字句スコープ内でのみ有効です。次に例を示します。
上記のプログラムを実行した出力結果は次のとおりです。
カウンタの値は次のとおりです。 0 カウンタの値は次のとおりです。 1 カウンタの値は次のとおりです。 2 カウンタの値は次のとおりです。 3 カウンタの値は次のとおりです。
注 1: state は、サブルーチン内に閉じられたスコープを持つ変数のみを作成できます。
注 2: state は Perl 5.9.4 から導入されたため、使用する前に use を追加する必要があります。
注 3: state はスカラー、配列、およびハッシュを宣言できます。ただし、配列とハッシュは宣言時に初期化できません (少なくとも Perl 5.14 では)。
サブルーチン呼び出しプロセス中に、コンテキストに応じてさまざまなタイプの値が返されます。たとえば、次の localtime() サブルーチンは、スカラー コンテキストでは文字列を、リスト コンテキストではリストを返します。
上記のプログラムを実行した出力結果は次のとおりです。
日曜日 6 月 12 日 15:58:09 20162106-6-12 15:58:9