質問: decode('shiftjis', $content); # コンテンツのコード変換 18 $content =~ s///gs; # HTML内のコメント削除 19 $content =~ / SELECTED>▼([^<]+); # 国名の取得 20 print "$1\n"; 21 if ($content =~ /現在、危険情報は出ておりませんが、/) { 22 print " 危険情報は出ていません。\n"; 23 } else { print " 危険情報が出ています!\n"; }; 24 print " 詳細はhttp://www.anzen.mofa.go.jp/を見てください。\n"; ``` ### 発生している問題・エラーメッセージ > > $ perl mofa_anzen.pl > > > ``` Use of the encoding pragma is deprecated at mofa_anzen.pl line 5. Bareword found where operator expected at mofa_anzen.pl line 14, near ""$url を読み込めませんでした。" unless" (Missing operator before ss?) syntax error at mofa_anzen.pl line 14, near ""$url を読み込めませんでした。" unless " Unrecognized character \xE3; marked by <-- HERE after ofa.go.jp/<-- HERE near column 48 at mofa_anzen.pl line 23. ``` ### 補足情報(言語/FW/ツール等のバージョンなど) > > $ perl -v > > > とすると > > This is perl 5, version 20, subversion 2 (v5.20.2) built for x86_64-linux-gnu-thread-multi > > (with 53 registered patches, see perl -V for more detail) > > Copyright 1987-2015, Larry Wall > > Perl may be copied only under the terms of either the Artistic License or the > > GNU General Public License, which may be found in the Perl 5 source kit. > > Complete documentation for Perl, including FAQ lists, should be found on > > this system using "man perl" or "perldoc perl". If you have access to the > > Internet, point your browser at http://www.perl.org/, the Perl Home Page. > > > と表示されます。 ### 余談 また、ネット上で配布されていたサンプルコードはもともとWINDOWS-31Jで書かれていたようなので、vimで編集しようとした際に文字化けをしていました。 そこで > > find copy -type f | xargs file | grep -v ":.*pl" | cut -d: -f1 | xargs -t -I{} iconv -f WINDOWS-31J -t utf-8 {} -o {} > > > で変換するということを行いました。これらは原因に関係ありますか?
回答: そもそも以下のページにアクセスできるのでしょうか?このperlのソースは今でも動くものですか? http://www.anzen.mofa.go.jp/info/info4.asp?id=074 perlは素人なのですがやっていることは上のようなURLへアクセスしてhtmlを取得しその中からある文字列が含まれているかどうかチェックするだけの単純なものにみえます。 上のurlにアクセスできなかったのでhttp://www.anzen.mofa.go.jp/にアクセスしてHTMLのソースをみてみたところ、文字エンコードは以下のようにutf-8でした。ブラウザーの設定によるのかも知れませんが・・・ ...... そこで試しに以下の仮定をおいて試してみたところなにがしかのの結果は得られました。 1. shellでLANGを確認 ja_JP.UTF-8と表示されているのでutf-8前提でスクリプトを書き直してみた 2. 元のutlはブラウザーでアクセスしてもページがないといわれるのでひとまずトップページのurlに変更 ``` #!/usr/bin/perl -w use strict; use LWP::Simple; use Encode; use encoding 'utf-8'; ####shiftjis=>utf-8 binmode(STDERR, ':raw :encoding(utf-8)'); ###shiftjis=>utf-8 #my $id = shift @ARGV || '074'; # 引数の取得(デフォルトはニュージーランド)###無視 # 外務省海外安全ホームページ #my $url = "http://www.anzen.mofa.go.jp/info/info4.asp?id=$id";###このurlはアクセスできなかった my $url = "http://www.anzen.mofa.go.jp/"; ###試しにこのurlに変更 my $content = get($url); die "$url を読み込めませんでした。" unless defined $content; # $contentを読み込んで危険情報を確認する。 #$content = decode('utf-8', $content); ###utf-8で統一したのでコメントアウト $content =~ s///gs; # HTML内のコメント削除 $content =~ / SELECTED>▼([^<]+); # 国名の取得 print "$1\n"; if ($content =~ /現在、危険情報は出ておりませんが、/) { print " 危険情報は出ていません。\n"; } else { print " 危険情報が出ています!\n"; }; print " 詳細はhttp://www.anzen.mofa.go.jp/を見てください。\n"; ``` ==>結果 ~/test/perl$ ./mofa_anzen.pl Use of the encoding pragma is deprecated at ./mofa_anzen.pl line 5. layout 危険情報が出ています! 詳細はhttp://www.anzen.mofa.go.jp/を見てください。 (`deprecated`と出ているので現在のperlでは別の方法で文字エンコーディングを扱うべきなのかなと思います。perl素人なので詳しいことはわかりません。スミマセン) * どのurlから情報を得るべきか * 文字のエンコードをどう取り扱うべきか を確認することで先に進めるのではないでしょうか? 補足: 失礼しました。自分の環境を言い忘れていました。virtual box上(ホストWindows10)で動かしたUbuntu 16.04 LTSです。perlのバージョンは以下の通りです。 This is perl 5, version 22, subversion 1 (v5.22.1) built for x86_64-linux-gnu-thread-multi