Translate

2009年6月21日日曜日

SPIDERING HACKS(#9)

SPIDERING HACKSのめも。
やっぱり、この手の物は自分のコーディングの
仕方で書いてみるにこしたこたーないしね。

#9 LWP::Simpleを用いた簡単なデータ取得。
自分なりに書いてみた。

文字コードはutf8で書いてます。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use LWP::Simple;
use Encode;

my $id = shift || '074'; #デフォルトはNz
die "数字を入力して下さい" if ($id !~ m/\d+/);

#外務省海外安全ホームページ
my $url = "http://www.anzen.mofa.go.jp/info/info4.asp?id=$id";
my $content = decode('shiftjis', get($url));
die "{$url}を読込めませんでした。" unless defined $content;

#$contentの中身を解析。
$content =~ s/<!--(.*?)-->//gs;
$content =~ / SELECTED>▼([^<]+)</;
print encode("utf8", "$1\n");
if($content =~ /現在、危険情報は/){
print encode("utf8", "現在、危険情報は出ていません。\n");
}else{
print encode('utf8', "詳細をhttp://www.anzen.mofa.go.jp/で確認して下さい!\n");
}


4行目でuse utf8;をしてマルチバイト文字列はフラグ扱いしています。

8行目メモ。
フラグ付きのコードを書く時って、通常外からデータが来たら
フラグをつけて、出ていく直前にフラグを取るのが鉄則だったり
するけども、8行目のIDについては数字(非マルチバイト)を扱うので
フラグをつけようとしてません。。

13行目メモ。
海外安全ホームページの文字コードはshiftjisなのでフラグ付きにする際に
decode('shiftjis', get($url))で“shiftjisですよ”と教えてあげる。

14行目メモ。
die "{$url}を読込めませんでした。" unless defined $content;

{$url}←これ。
フラグ付きコード特有のあれです。
フラグ付きにすると、マルチバイト文字列をも変数にすることができます。
my $日本語 = "あいうえお";
すら扱うことができます。
つまり、"$urlを読込めませんでした。"ってすると$urlからでした。までが
変数扱いを受けてGlobalだyo!っておこられます。
なので、中括弧でかこって、{$url}とすることで変数がどこまでか明確化するか
$url を読・・・のように半角スペースを入れて変数を区切る必要がありますね。

19,21,23行目
フラグ付きの鉄則として外に出す前にエンコードってことで
エンコードしてます。本コードがutf8で書いているので
エンコードする際には、utf8にしてね。としています。

以上!

0 件のコメント: