Perlゼミ(サンプルコードPerl入門)

新着情報 2018年 Twitter Perl入学式 イベント情報

2010年02月20日

undef関数 - 未定義値

  1. Perl
  2. 関数
  3. here

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

  1. Perl
  2. 関数
  3. here

kitskits 2010/03/14 20:10 undef は「引数(左辺値)を未定義とし、未定義値を返す関数」であり、例は両方ともundef関数を使っているものかと思います。
(Perlのundefに「値」「関数」という別の概念があるわけではないと思います)

perlcodesampleperlcodesample 2010/03/14 22:20  勘違いしていました。JavaのNull値のようなものだと思っていたのですが純粋な関数だったんですね。記事を修正しました。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証