バージョンアップは定期的にしましょう
古いブラウザでの閲覧として弾かれる
会社PCで動かしているPerlスクリプトがエラーを吐くようになった。それは特定のウェブサイトからコンテンツを収集するスクリプト。ある日からエラーが発生し、コンテンツの収集が出来なくなった。そのウェブサイトからは「古いウェブブラウザからのアクセスを制限する」という旨のエラーページが表示されているようだ。エージェントの名称を新しいものにしても解決せず途方に暮れる。
モジュールが不足している?
対象のウェブサイトがSSL(https)だったから失敗するのか?エラーが出る前もSSLだったのにどうして?とりあえず下記のモジュールを入れる必要がありそう。
- Net::SSLeay
- Crypt::SSLeay
- IO::Socket::SSL
参照したサイト → PerlでSSL(https)のサイトのコンテンツが取得できない
PPMでインストールを試みる
会社PCはWindowsなのでActivePerlを入れている。ActivePerlのモジュール管理ソフトのPPM(Perl Package Manager)でインストールを試してみる。しかしインストールしたいモジュールが一部入手できない!Repositoriesをいじっても結果変わらず。
とりあえずPerlのバージョンアップ
PPMを開いたときに多くのモジュールのバージョンが古くなっていた。さらに調べるとPerl自体のバージョンもだいぶ上がっていたのでスクリプトのエラーについては一旦保留にしてPerlのバージョンアップをすることにしました。バージョンアップ前のバージョンが5.12、最新バージョンが5.26、会社に入社以来バージョンアップをしてませんでした。私しかPerlを使わないので問題なかったのだ。
バージョンアップは定期的にしましょう
結果、Perlのバージョンアップしたらエラーを出していたスクリプトが正常に稼働しました。(バージョンアップによる仕様変更のため修正が必要でしたが、これはすぐに解決しました。)定期的にバージョンアップすることも大切なことに気付かされました。
備考:@INCからカレントディレクトリが削除
Perl 5.26ではカレントディレクトリにあるモジュールがデフォルトで読まれなくなった。libモジュールでカレントディレクトリを検索するように指示することで回避した。
use lib qw(.);
今までは@INCの末尾にカレントディレクトリが入っていたのだが、このバージョンから削除されたらしい。libモジュールを使うと@INCの先頭に特定のディレクトリが追加されるので挙動が全く同じではないけど、現状はこの方法で問題を回避することにする。
参照したサイト → 第46回 Perl 5.26で変わること(1)