みのるのはてなブログ

プログラミングレッスンの備忘録

Perlで未定義値かどうかを判定する

結城浩さんの著書に、 『新版Perl言語プログラミングレッスン入門編』 というのがある。私が持っているのは新版ではなく初版本である。15年ほど前に定年でサラリーマンをリタイアした頃に初めてこの著書に出会った。その頃に自作したスクリプトuse warnings; を入れて復習してみると思わず苦笑いのコードが見つかる。

foreach my $line (@log){
    chomp($line);
    my ($no,$name,$date,$mail,$comment,$pass)=split(/,/,$line);
    # $comment が空だった場合の処理
    if($comment eq ""){
    $comment=$no;$c++
    }
    if ($c > 7){  # 7日分を取得したら繰り返し終了
    last
    }
    ....

このスクリプトも機嫌よく動作してくれていたので間違いに気づきませんでしたが、use warnings; を入れたところ「未定義の変数だよ!」 と叱られた。

Use of uninitialized value ...

↓ 犯人はこれだ。

if($comment eq ""){
    $comment=$no;$c++
}

$comment が存在しなかったときに他の変数を代入する…というのが本来の目的だったので落ち着いて考えたら当たり前なんですが、こんな条件式でも動いてくれてたんですね。Perl はやさしい(^o^)

ググってみたら未定義値かどうかを判定する defined関数 というのがあるのを知りました。

if (defined $hoge) {
  ...
}

上記は定義されている場合に処理させるというものです。私の場合は値が未定義だった場合に処理をさせたいので unless を使って下記のように修正して警告が出なくなりました。

めでたし(^o^)

# $comment が未定義だった場合の処理
unless (defined $comment){
    $comment=$no;$c++
}