Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. 標準関数
  3. here

defined関数 - 値が定義されているかを確認する

値が定義されているかを確認するにはdefined関数を使用します。

# 値が定義されているかの確認
$is_defined = defined $value;

定義されているとは

defined関数で判定できる定義されている値とはなんでしょうか。考えてみましょう。

変数宣言した場合は、代入による初期化を行わなかった場合は未定義となります。

# 宣言直後は未定義
my $value;

値を代入すると、値が定義されている状態になります。

# 値を代入したので定義されている状態になる
$value = 5;

undef関数を使って、未定義値が代入されると値は未定義になります。

# undefを代入すると未定義になる
$value = undef;

真偽値との違いは?

defined関数で判定できる「定義されている/定義されていない」というのは「真/偽」という概念とは異なることに注意してください。定義されているとは未定義値ではないということです。

一方、真であるというのはPerlにおける偽の値ではないということです。真偽値については以下の記事を参考にしてください。

「ハッシュの値が定義されている」と「キーが存在している」のとの違いは?

exists関数を使うとハッシュのキーが存在しているかどうかを確認することができます。キーが存在していることと、値が定義されていることは異なることです。

defined関数による判定とexists関数による判定の結果は異なることがあります。

次のような場合は、値は未定義だけれど、ハッシュのキーは存在しているといえます。

my %scores;

# キーは存在するが、値は未定義
$scores{math} = undef;

配列とハッシュへのdefine関数は廃止予定

配列とハッシュは宣言されると未定義値にはならずに、空リストが代入されます。

my @nums;
my %scores;

これは以下と同じです。

my @nums = ();
my %scores = ();

配列やハッシュに対するdefined関数に使用は廃止予定となっています。代わりに単純に空リストであるかどうかをチェックしてください。

if (@nums) { ... }
if (%scores) { ... }

便利なDefined-or演算子

値が未定義だった場合に右辺を代入できるDefined-or演算子という便利な演算子があるので紹介しておきます。

my $num;

# 未定義だったら「defined-or演算」を使って3を代入
$num //= 3;

サンプル

defined関数を使って定義されているかどうかを確認するサンプルです。

use strict;
use warnings;

my $num = 3;

if (defined $num) {
  print "Defined\n";
}
else {
  print "Not defined\n";
}

定義されていないことが主要なロジックであった場合はunlessと組み合わせるのも読みやすいです。

use strict;
use warnings;

my $num;
unless (defined $num) {
  print "Not defined\n";
}
Giblog