荻野といいます。以前に挫折した組なのですが、Ruby本がでてから再度挑戦を
はじめています。しかし Perl で行き詰まると周囲から助けが来る当てがある
のですが、Ruby で行き詰まると... というわけなの質問はここでよかったで
しょうか? 今回は行き詰まるというより迷っているのですが。

# Ruby プログラミングの初心者を助け or 指導するメーリングリストがあれば
# ruby-list の内容と流量にびびってしまう私のような人間も助かるかも


CGI でメールアドレスを入力してもらいたいと思うのですが、これの確かさを
ある程度確保したいと考えました。よくある要求だと思うのですが、なかなか
良い解答が見つからないでいます。

そこでとりあえず MX を引いてからそこのサーバに EXPN や VRFY やら MAIL
FROM: と RCPT TO: を送って反応を見ればいいのではと思ったのですが、MX
を Ruby から引く方法は nslookup を起動する以外には見つかりませんでした。

つきましては、いくつかお教えいただければ幸いです。

1) 外部コマンドに頼らず A レコード以外の DNS を引く方法またはライブラ
   リのようなものはあるのでしょうか

2) 外部コマンドを起動して、その出力をもらいつつ最後のエラーコードを見
   るにはどうすればよいのでしょうか

3) そもそも本来の目的(入力されたメールアドレスの確認)にもっと良い方法
   があるのでしょうか。(あるようにも思いますが)

4) アドレスのパターンを確かめる(入力エラーなどの排除)方法として

      addr = address.dup
      # check only one address
      addr.gsub!(/[\s\n\r]+/, '')
      addr.sub!(/\"[^"]+\"/, '')
      addr.sub!(/,.*$/, '')
      addr.sub!(/\(.*\)/, '')
      addr = $1 if /\<([-\w.]+@[-\w.]+)\>/ =~ addr
      addr << '.' unless /\.$/ =~ addr  # for WindowsNT
      return false unless /^[-\w.]+@[-\w.]+$/ =~ addr

というのを書いてみましたが、正しいアドレスまではじきはしないかと心配で
す。もっと良い方法がないものでしょうか。



その他:Ruby本で「はまった」こと

上記の部分で、ちょっと sub! と sub の違いにはまりました。文字列の複数
の部分を置換していくのに

    str = str.sub(aa,bb).sub(cc,dd).sub(ee,ff)

は大丈夫なのに、速そうな

    str.sub!(aa,bb).sub!(cc,dd).sub!(ee,ff)

と書けないということに気が付くまで、結構時間がかかりました。(エラーメッ
セージにはちゃんと undefined method `sub!' for nil と書いてあったので
すから、悪いのは私なんですが)

    str.sub!(aa,bb)
    str.sub!(cc,dd)
    str.sub!(ee,ff)

と書くべきなのでしょうか。

Ruby本の P.39には「メソッド!」は同じオブジェクトを指している他の変数が
ある場合のことだけが強調されているように読めるので、「メソッド」を「メ
ソッド!」と置き換えると返る値が変わってしまうと書いてあると、私のよう
な人間は助かるかもしれません。(あのコラムからは「オブジェクト自体が変
化する」こと以外では同一という印象をもつので)

また、P.38、P.71、P.491、P.512 を見ても sub/sub!、gsub/gsub! が異なる
値を返すとは書いていないようです。ひょっとしてどこにも書いていないので
しょうか。(しかしミニではない「Ruby リファレンスマニュアル」を見ると、
メソッド!が破壊に失敗(?)したときに nil を返すのは一般的なようですね。)

わたしは irb.rb (これもどこにあるのか Ruby本では見つかりませんでした) 
をなんとか見つけていろいろ試したあとに、「えー」と思って Ruby本をひっ
くり返し、やっと http://www.ruby-lang.org/ja/man-1.4/String.html で、
真相を発見(大げさ)しました。経験談ということで、今後の版(刷?)の際の参
考になれば幸いです。できれば「ミニ」ではない「Ruby リファレンスマニュ
アル」が紙で付いていればうれしいと思います。(付いてから買う人は、です
が)


使用環境;
    ruby 1.4.3 (1999-12-08) [sparc-solaris2.6]

    ruby 1.4.3 (1999-12-08) [i386-cygwin]
    (WindowsNT Server4 SP5 + Cygwin1.dll Build 2000-01-22 00:25:06)


# 一応、RCPT TO: に対して 250 と答えが返ってきても
# あまり当てにできないことは承知しております。


-- 
荻野 充 (おぎの みつる) ... 「萩(はぎ)」にあらず
名古屋大学消費生活協同組合