Perlで未定義値と空文字列は同じ?

[上に] [前に] [次に]
える 1999/12/21(火) 11:50:10
Perlで、

if ($switch eq '')

unless(defined $switch);

は同じことをあらわしているのでしょうか?


 また、これとは関係ないのですが、
print "Defined" if defined $array$key;
で、$array$keyとつなげて書いてある部分は、どういう意味ですか?

wosamu 1999/12/21(火) 12:15:14
ちょっと違います。
$switchがそれまで一切使用されていないなら
上記は同じ結果ですが、
$switch='';
なんていう風に定義されているなら、
defined $switchは真を返します。

たぶん(笑)

ラウォッチ 1999/12/21(火) 13:09:45
私のperl本には
未定義値は、数値は0,文字列はブランクの空文字列となっています。

$array$key はバグでしょ?

ふじ 1999/12/21(火) 14:12:59
細かいことですが、

> $switchがそれまで一切使用されていないなら
参照するだけだと、使用しても未定義のままです。念のため。

print $a;
if(defined $a){print 1}else{print 0};
$a = '';
if(defined $a){print 1}else{print 0};


> 未定義値は、数値は0,文字列はブランクの空文字列
未定義値を数値として評価すると 0
文字列として評価するとから文字列として評価される、ってことですね。

> print "Defined" if defined $array$key;
これは構文エラーになります。
$array[$key] か、 $array{$key} の誤植かなぁ。

wosamu 1999/12/21(火) 14:39:16
>参照するだけだと、使用しても未定義のままです。念のため。
ご指摘ありがとうございます。
不正確な書き方はいけませんね。
>$array[$key] か、 $array{$key} の誤植かなぁ。
前後がないと確定できないですけどその確率が高いでしょうね。
#$array+$keyとか$array.$keyとか(笑)
で、結局、
>は同じことをあらわしているのでしょうか?
に関しては、違うけど、
陽に入力された空文字列と未定義値を区別する必要が特にないなら、
同じとして考えて良い、ということでどうですか?

える 1999/12/21(火) 19:08:32
[[解決]]
 みなさま、回答どうもありがとうございました。
 
 まとめると、変数には
 ・未定義
 ・定義されているけど、空
 ・値が入っている
という3つの状態があって、変数を評価する時には、
 ・未定義なら、空
 ・空なら、空
 ・値が入っていたら、値
が返ってくる。

 だからこそ、definedという演算子も存在価値がでてくるというものですね。


#書き忘れていましたが、
#print "Defined" if defined $array$key;
#の出典はPERLFUNC.HLP(原配布先は知らないのですが)で、

>     exists EXPR
>             指定されたハッシュ key が、ハッシュ配列に存在すれば、
>             たとえ対応する value が未定義でも「真」を返します。
>                 print "Exists" if exists $array$key;
>                 print "Defined" if defined $array$key;
>                 print "True" if $array$key;

と書いてありました。誤植だったんですね。どうもありがとうございました。

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