原です。
青山さんの telnet.rb のエンジンをパクって、昔作り書けていた telnet スク
リプトをまとめて ttelnet という名前で netlab に置きました。。多分に実験
的なものなので、telnet.rb に取って代わろうという気は全くありません。
In message "[ruby-list:16987] Re: mn128.rb & telnet.rb"
on 99/09/22, wakou / fsinet.or.jp <wakou / fsinet.or.jp> writes:
|
|青山です。
|Perl の Net::Telnet でもだいたいあのような感じみたいです。異なっていて
|少し気になる点としては、sysread の前にはやはり select を使用しているの
|ですが、プロンプト(サーバーからの送信文字列の終り)の判定には select を
|使用していません。
|
|これで大丈夫なのかな、という気はしますが、/prompt$/ と、\z ではなく $
|を使用しているという事は、文字列の末尾を得ようとは思っていないのかもし
|れません。
ふーむ、Perl 版ってけっこう乱暴なんですね。
|もう一つは原さんご指摘の preprocess の部分です(ありがとうございました。
|大きなバグが取れました。)。ここを置換ではなく、index を使用しています。
|
|結局は substr を使って置換作業自体は行っているので、あまり変わらないか
|もしれませんが、いつか速度比較等をやってみる価値はありそうです。
多分、あまり変わらないのではないでしょうか。結局ネゴシエーションのシーケ
ンス開始の IAC をひとつ見つけるコストの差ぐらいしかないし。その差は小さ
い。
と言いつつ、ttelnet.rb では index を使ってみました。ついでにオートマトン
を生成して実直に受け答えをする。しかし、オートマトンって結局正規表現だか
ら telnet.rb に比べ機能が勝っているわけではないのだなあ。(^^; 機能の拡張
はしやすいかもしれせんが。
|> もうちょっと違うインタフェース(パソコン通信ソフトのマクロの様な)
|> も考えて見たのですが、いまいち。
|
|そうですね。私も少し考えてはみたのですが、やはり現在のような
|Net::Telnet タイプが無難なようでした。せいぜい、ブロックを渡してリアル
|タイム出力が出来るようにした程度です。(しかし、これはとても便利だと思っ
|ています。)
プロンプトを待つと途中経過が取れない、途中経過を取るとプロンプトが取れな
いというジレンマがあるのですよね。途中経過をイテレータで見るというこの使
い方はほとんど唯一の解決策かもしれません。
しかしやはり私は「行指向」な感覚で使えるものが欲しかったので、ttelnet.rb
では、gets(/regexp1/, /regexp2/, ...) で改行と複数のプロンプトを同時に待
つようにしてみました。
ちなみに ttelnet.rb ではバッファリングも自前にしてみました。これも有効で
あるか疑問です。実は今になって telnet.rb の waitfor() にある次のアイデア
を拝借すれば不用である気もして来ました。(^^;
buf = preprocess(buf)
if /#{IAC}.?\z/no === buf
next
end
なるほどこういう手があったか、これだけの事に気がつかなかった。しくしく。
#しかしこのままだと buf が複数回 preprocess されて、例えば IAC 4つが
#1つになる事がありますね。すぐ直ると思いますが。