perlでのNULL値を'0'(ゼロ)に変えるには?

[上に] [前に] [次に]
tomo_pyon [E-Mail] 2000/03/17(金) 17:38:18
perlでNULL値を数字のゼロに変換したいのですが、
どのようにしたら良いですか?

びーだま [E-Mail] 2000/03/17(金) 23:09:21
結構簡単そうで意味的には奥が深いですね。
読み違いが無いように補足してみます。

「NULL 値 が ”定義済みの”スカラー変数なら 0 に変換する。」

ということで良いですか?
逆に言うと「”未定義の”スカラー変数は、0 にしない」と
質問の内容を解釈しました。

で、サンプルコードは以下の通りです。

# undef $value;
$value = "";
$value += 0 if $value eq "" && defined($value);
print $value;

最初に、$value = ""; としたときと、undef $value; とした
ときで、出力結果が異なることに注目してください。

$value は "" (NULL値)なら、0 undef なら、未定義のままです。

ここで、$value = 0 とせずに、 $value += 0 としていることに
も一応意味があります。

0 が数値なのか、文字なのかを明示的に処理させるためです。
この場合は、数値であることを明示しています。

Perlでは文字単位でのデータ取り扱いがほとんどの作業だと
おもうので、通常あまりこの差が問題になることはありません
が、ビットごとの論理演算を行おうとしたときに違いが出て
きます。

びーだま [E-Mail] 2000/03/17(金) 23:15:19
あ、質問をよーくみたら、'0' とありますね。
ということは、0 は文字ですね。

というわけで、

$value += 0 if $value eq "" && defined($value);

は、

$value = '0' if $value eq "" && defined($value);

が意味的には正しいです。

ちなみに、条件としては、本当は NULL だけじゃなくて、未定義
の場合もだよ。というなら以下のようにするので良いです。

文字としての 0 とする場合
$value = '0' unless $value;

数値としての 0 とする場合
$value += 0 unless $value;

びーだま [E-Mail] 2000/03/17(金) 23:19:01
ごめんなさい、厳密には、

$value = '0' unless $value;

または、

$value += 0 unless $value;

とした時の条件は、
 NULL, 未定義 と加えて 文字、あるいは 数値の 0 の時、
 (それぞれの意味の)0 にする。

となります。

# 何度もごめんなさい。 書いたあとで気づくもので・・・(^^;

tomo_pyon [E-Mail] 2000/03/21(火) 09:49:20
[[解決]]
ありがとうございました。
無事、処理できるようになりました。

[上に] [前に] [次に]