2008-03-17から1日間の記事一覧

10.5 配列、ハッシュをリファレンスで関数に渡す

バックスラッシュ演算子を使用する。 array_diff( \@array1, \@array2 );

10.4 現在実行されている関数の名前を取得する

caller関数を使用する。 $this_function = (caller(0))[3];

10.3 値を保持する局所変数を作成する

次の呼び出し時にも前の値をそのまま残してくれる変数を作成したい。ただし、この変数には、サブルーチンの外側からはアクセスできないようにしたい。 関数を別のブロックで囲み、my変数を関数のスコープ外、ブロックのスコープ内で宣言する。 { my $variabl…

10.2 関数内に局所変数を作成する

myを使用して、サブルーチン内でしか使用できない局所変数を宣言する。 sub somefunc { my $variable; # $variable変数にはsomefunc()関数の外部からはアクセスできない。 my ($another, @an_array, %a_hash); # 複数の変数を一度に宣言することも可能 }

10.1 サブルーチンの引数にアクセスする

直接アクセス sub hypotenuse { return sqrt( ($_[0] ** 2) + ($_[1] ** 2) ); } 名前付き局所変数にコピー sub hypotenuse { my ($side1, $side2) = @_; return sqrt( ($side1 ** 2) + ($side2 ** 2) ); }

10.17 多分岐文を書く

標準モジュールSwitchを使用する。 use Switch; switch ($value) { case 17 {print "number 17} case "snipe" {print "a snipe"} case /[a-f]+/i {print "pattern matched"} case [1..10,42] {print "in the list"} case (@array) { print "in the array"} c…

10.16 サブルーチンをネストする

一方のサブルーチンが、もう一方のサブルーチンからしか参照、呼び出しができないようにしたい。 内側の関数を通常のサブルーチンにするのではなく、クロージャにする。そして、そのリファレンスを適当な名前の型グロブに一時的に代入し、ローカル関数を作成…

10.15 AUTOLOADを使用して未定義の関数を捕捉する

未定義関数の呼び出しを捕捉したい。そしてそれらを適切に処理したい。 未定義関数と同じパッケージ内でAUTOLOADと言う名前の関数を定義する。未定義関数が呼び出された場合、このAUTOLOAD関数が代わりに呼び出され、その未定義関数の名前がパッケージ名付き…

10.14 関数を再定義する

関数の定義を一時的、もしくは恒常的に変更したい。しかし、既存の関数名に新しい関数の定義を関連づけることはできない。 関数を再定義するには、その関数と同じ名前の型グロブに新しく定義した関数のリファレンスを代入する。定義を一時的に変更したい場合…

10.13 グローバル変数の値を一時的に別の場所に保存する

local演算子を使用する。この値はブロックが終了した時点で、グローバル変数に自動的に戻される。 our $age = 18; if (CONDITION) { local $age = 23; func(); # 一時的な値23を参照 } # ブロックが終了したので、グローバル変数$ageには、元の値18が戻され…

10.12 例外を処理する

例外を発生させる可能性のある関数を安全に呼び出したい。また、例外を発生させる関数を作成したい。 例外を発生させる die "some message"; 例外を捕捉する eval { func() }; if ($@) { # $@に例外の内容が捕捉される。 warn "func raised an exception: $@…

10.10 エラーを返す

エラーが発生したことを表す値を関数から返す。 return文を引数を指定しないで書く。このようにすると、スカラーコンテキストでは、undefが返され、リストコンテキストでは、空のリスト()が返されます。 return;

10.11 関数のプロトタイプを宣言する

関数プロトタイプを使用して、コンパイラが引数の型をチェックできるようにしたい。 Perlの関数プロトタイプは、コンテキストを強制するもので、ユーザ定義の関数を組み込み関数(pushやpopなど)のように動作させたい場合に使用する。

10.9 複数の配列もしくはハッシュを戻り値として返す

配列もしくはハッシュのリファレンスを戻り値として返す ($array_ref, $hash_ref) = somefunc(); sub somefunc { my @array; my %hash; # ... return (\@array, \%hash); }

10.8 所要の戻り値のみ取得する

戻り値を代入するリスト内の不要な戻り値が返される位置にundefを格納する ($a, undef, $c) = func(); 戻り値のリストをスライスして、所要の戻り値のみを取得する ($a, $c) = (func())[0,2];

10.7 名前付きの引数を渡す

サブルーチン sub thefunc { my %args = ( INCREMENT => '10s', FINISH => 0, START => 0, @_, # 名前付きの引数のリストがここに格納される }; if ($args{INCREMENT} =~ /m$/ ) { ... } } 呼び出し側 thefunc(INCREMENT=>'20s', START=>'+5m', FINISH=>'+30…

10.6 戻り値のコンテキストを取得する

関数が呼び出されたコンテキストを取得したい。これができれば、コンテキストに応じた処理が行える。つまり、1つの関数で複数の処理が行える。 wantarray関数を使用する if (wantarray()) { # リストコンテキスト } elsif (defined wantarray()) { # スカラ…