変数初期化と確認

Perl で変数や配列が定義されたかどうかを調べるときは defined を利用する。配列の添字やハッシュのキーなどが存在するかどうかを調べるときは exists を利用する。また、定義、存在とは別に、変数は真(TRUE)または偽(FALSE)という状態ももつ。

  1. スカラー変数
  2. 配列
  3. ハッシュ

スカラー変数

数字また文字列が代入されているスカラー変数が、定義されているかどうかを調べるとき defined を利用する。また、定義されたスカラー変数に対して、それがゼロあるいは空文字でなければ真と判断される。

sub checkType {
  my $arg = shift;
  print "$arg\t";
  if ($arg) {
    print "TRUE\t";
  } else {
    print "FALSE\t";
  }
  if (defined $arg) {
    print "defined\n";
  } else {
    print "undefined\n";
  }
}

my $a;           # 値なし
my $b = 0;       # ゼロ
my $c = 1;       # ゼロ以外の数値
my $d = '';      # 空文字
my $e = ' ';     # 空白文字
my $f = 'e';     # 文字
my $g = \$a;     # アドレス(リファレンス)


&checkType($a);
&checkType($b);
&checkType($c);
&checkType($d);
&checkType($e);
&checkType($f);
&checkType($g);


## 実行結果
##       FALSE    undefined
## 0     FALSE    defined
## 1     TRUE     defined
##       FALSE    defined
##       TRUE     defined
## e     TRUE     defined
## SCALAR(0x2189d08)	TRUE	defined

Perl には以下のように変数の宣言する方法もある。//= は、左辺が undef ならば右辺が代入される。||= は、左辺が FALSE ならば右辺が代入される。

my $a;
$a //= 'atg';      # $a が 'atg' になる

my $b;
$b ||= 'atg';      # $b が 'atg' になる 

配列

配列の添字が存在するかどうかを確認する場合は exists を利用する。また、配列の値が存在(定義)されているかどうかを調べるときは defined を利用する。

my @arr = ();

$arr[0] = 0;      # 添字あり、値あり
$arr[1];          # 添字あり、値なし
$arr[2] = undef;  # 添字あり、値未定義
#arr[3]           # 添字なし、値なし
$arr[4] = 3;      # 添字あり、値あり

for (my $i = 0; $i < @arr; $i++) {
  print "$i ==> ";
  if (exists $arr[$i]) {
    print "    exists    ";
  } else {
    print " nonexistent  "
  }
  if (defined $arr[$i]) {
    print "   defined ";
  } else {
    print " undefined ";
  }
  print "\n";
}


## 実行結果
## 0 ==>     exists       defined 
## 1 ==>  nonexistent   undefined 
## 2 ==>     exists     undefined 
## 3 ==>  nonexistent   undefined 
## 4 ==>     exists       defined 

ハッシュ

ハッシュにはキーと値が 1 セットで保存されている。キーが存在するかどうかを利用する場合は exists を利用する。また、値が存在(定義)されているかどうかを調べる場合は defined を利用する。

my %hash = ();
$hash{A} = "a";    # キーあり、値あり
$hash{B} = undef;  # キーあり、値未定義

print "  key    value\n";
foreach my $key (keys %hash) {
  if (exists $hash{$key}) {
    print " YES";
  } else {
    print "  NO";
  }
  if (defined $hash{$key}) {
    print " YES";
  } else {
    print "  NO";
  }
  print "\n";
}


## 実行結果
## key    value
## YES      YES
## YES       NO