|
|
|
| [Perl]WWW::Mechanize の落とし穴 |
WWW::Mechanizeって手軽にWebクライアントが作れて便利いいのですが、たまに「うーん、頑張れ」と思える落とし穴もあったりします。
以下、後学のために無駄にはまってしまった点をいくつかご紹介。
■head()はスタックに積まれない WWW::Mechanize自体には head() はないのですが、LWP::UserAgentを継承しているので使うことができます。 で、親モジュールのメソッドなので結果はスタックに積まれません。当たり前ですが。 なので、スタックを使って back() することがあるクライアントの場合、head() するとカレントのコンテンツが head() した内容で上書きされてしまいます。 これが意外と盲点でした。 head() する前は _push_page_stack() するのをお勧めします。
■Windows環境ではsave_content()しないこと binmode()呼んでくれてませんので、バイナリファイルを保存しようとすると見事に化けます。 WWW::Mechanizeに限らないのですが、Windows環境でのファイル出力機能には要注意です。
■METAタグのrefreshでジャンプはしてくれない METAタグの解釈はしてくれます。 取得されるHTTP::Responseオブジェクトの中に Refresh ヘッダが追加されます。 ただ、あたかもヘッダがあったかのようにしてくれるだけでジャンプまではしてくれません。 ま、refreshは厳密にはリダイレクトではないのでクライアントマターになるのでしょうけど、”頑張ってよー”と思っちゃう点の最たるもんです。
■Storableでインスタンスをクローンできない CODEブロックが含まれているようで dclone() できませんでした。 もっとも、LWP::UserAgent が clone() メソッド持っているので、わざわざ dclone() する必要ないのですけど、その事実を知らなかったためにはまったというお話です。 普通ははまりませんわな、こんなとこに。とほほ。
ま、いずれも重箱ネタです。 ご参考までに。
|
|