• ベストアンサー

perlでundefでかえされるのですがDOS上では表示されません

下記のようなプログラムを書いてみたのですが、 $a="人ておもしろ。"; $b=$a=~s/人間/タコ/; print $a; print "$b\n"; if($b==undef){ print "undefと認識";} else {print "undefと認識していない。";} undefの文字を変えても真の判定をするようですので、 いったい$bにはどのような値が入っているのでしょうか。 一応置換できた場合は1が入っているのが確認できております。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> 置換されなかった場合は$bにundefが入ると思うのですが、 そう思う根拠はなんでしょうか? マニュアルには次のようにあります。 s/PATTERN/REPLACEMENT/egimosx Searches a string for a pattern, and if found, replaces that pattern with the replacement text and returns the number of substitutions made. Otherwise it returns false (specifically, the empty string). 実際に置換が行われればその回数、そうでなければ false が 返されるとあります。ここでいう falses は undef のことではありません(specificallyの ところにあるように空文字列、数値として評価すれば0となります)。 > print "$b"; としてもundefと表示されません。 変数をダブルクォートの中に入れた場合、変数の値を文字列で表すように変換されますが、 変数の値がundef であるときに文字列化しても 'undef'という文字列にはなりません。 なぜといわれてもそういう仕様だからとしかいえません。 ですから、自分で defined 関数を使って判定して自力で 'undef' という文字列を出力するか >perl -MData::Dumper -e "my $x; print Dumper($x);" $VAR1 = undef; のような手順を取らなければなりません。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

$bにはいる値ですが、 $a=~s/人間/タコ/; で実際に行われた置換の数、つまりこの場合は置換が行われれば1、 行われなければ0です。 > if($b==undef){ これで何をしようとしているのか意図を読み取れないのですが、 $bが0ならこのifは真になります。それ以外なら偽です。 ある変数が存在するかどうかならdefined を使います。 if (defined $b) のように。

abesouri
質問者

お礼

ありがとうございます。 置換されなかった場合は$bにundefが入ると思うのですが、 print "$b"; としてもundefと表示されません。 置換されなかったときの$bの値はどのように取り出したらよいのでしょうか。

関連するQ&A