undef関数 - 未定義値
undef関数を使えば、未定義値を設定することができます。あるいは、引数に指定した変数の値を未定義にします。
undef undef(変数)
未定義値の設定は次のように行います。変数「$name」の値が未定義になります。
$name = "Kimoto"; $name = undef;
また次のようにundef関数の引数に変数を渡しても、変数の値を未定義にすることができます。
$name = "Kimoto"; undef $name;
配列やハッシュについてもundef関数を利用することができます。
@names = undef; undef @names; %scores = undef; undef %score;
未定義値の判定
未定義値かどうかを判定するためにはdefined関数を使用することができます。定義されている場合は真を、未定義の場合は偽を返します。
if (defined $name) { ... }
値が未定義だった場合を処理するのにunlessを使って書く方法もお勧めです。
unless (defined $name) { # 未定義だった場合の処理 }
未定義値との比較
undefは文字列として比較された場合は「空文字」として、数値として比較された場合は「0」として扱われます。
undef == 0 undef eq ""
warningsモジュールを使えば、このような場合に警告を発してくれて、未然にバグを防げるので、必ず宣言するようにしましょう。
use warnings;
undefを使ったメモリ解放
undefを代入すればメモリは解放されます。
けれども、Perlでは、レキシカル変数を使えば、スコープの終わりで自動的にメモリ解放が行われるので、メモリ解放のためにundefを使う機会はまずないでしょう。
{ my $num = 5; } # スコープの終わりで「$num」のメモリは解放される
ただし、スコープが終わっても、クロージャーの場合などで、メモリが解放されない場合があります。このような場合には、明示的にundefを使ってメモリ解放を行うことができます。
クロージャについては以下の記事を参考にしてください。
サンプル
実行して試せるundef関数のサンプルです。
use strict; use warnings; # 変数に未定義値を設定 my $name = "Kimoto"; $name = undef; if (defined $name) { print "Defined"; } else { print "Undef"; }