Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

変数に値があるかどうか

いい加減以下のようなところが見るに耐えなくなったので。

$trgt;
........ # 何か処理
if ($trgt ne "") {
  EXPR;
}

このままuse warningsすると(されてなかったので)、$trgtに値が入っていない場合、以下の警告が出る。

#=> Use of uninitialized value in string ne at - line 3.

最近でこそ慣れたけれど、Perl勉強したての頃はよくこの警告を消すのに苦労していた。
それがここにきてまた対峙することになろうとは。
単純に if ($trgt) にしちゃうと、0 とか q{} に対応できないんだよなーと思いつつ、こんなサブルーチンを作った。

sub def {
  if (defined($_[0]) and q{} ne $_[0]) {
    return 1;
  }
  return;
}
if (def($trgt)) {
  EXPR;
}

サブルーチン呼び出しはコストがかかるみたいなのを見た気がするけれど、そんなパフォーマンスにシビアなとこじゃないし、第一そんなことを言ってられないのでこれでいこう。