Translate

2009年6月28日日曜日

SPIDERING HACKS(#10)

この項目では、LWP::Simpleでは要求したアドレスからただデータを受け取るだけ
なのに対し、クッキーや認証、要求が成立したのか、駄目だったのかを知るには
LWP::UserAgentでよりブラウザ的な振る舞いをさせるための設定を施し、結果を
HTTP::Response周りの関数で調べましょうね。
ってお話ですね。

ここでは、HTTP::Responseオブジェクトのis_successメソッドで
リクエストの可否を調べれることやリクエストが失敗した場合
status_lineメソッドに情報を取り出せること。
MIMEコンテンツ情報は、content_typeメソッドで調べられますよん
って話ですね。

詳細は、
LWP::UserAgent
とか
HTTP::Response
で、調べると良さそうですね。

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にしてね。としています。

以上!

2009年6月7日日曜日

CGI::Session

ちょいとメモ。
あちこち眺めつつ、サンプルをまねて.plで実行したら
セッション情報の書き込まれたファイルが生成されるのに
対し、.cgiでローカル環境で動かしてみたらファイルが
生成されないのは、なんで??
レンタル鯖にアップしてみたら普通に生成されてるし。。
うーん。

こういうもんなの??

2009年6月3日水曜日

diredモードのメモ

・diredモード
  → C-x + D

・directoryの作成
  → + (ディレクトリ名)

・directory/fileの削除(Delete)
  → 削除したい(directory|file)にカーソルを合わせ(大文字)D

・ファイル名を変更する(Rename)
  →(大文字) R

・表示内容を更新する
  → (小文字) g

2009年5月6日水曜日

Class::Accessor::Fastモジュール

Class::Accessor::Fastは、オブジェクト指向な書き方における
bless部分やgetter/setter部分を何度も書いてげんなりするのを
代わりに受け持ってくれるモジュール。

#./lib/Hogehoge.pm
package Hogehoge;
use strict;
use warnings;

sub new{
my $class = shift;
my $ref_arg = shift;
my $self = bless {
foo => $ref_arg->{foo},
baa => $ref_arg->{baa},
}, $class;
return $self;
}

sub accessor{
my $self = shift;
my $name = shift;
if(!@_){
return $self->{$name};
}else{
$self->{$name} = shift;
}
}

sub foo{
my $self = shift;
$self->accessor("foo", @_);
}

sub baa{
my $self = shift;
$self->accessor("baa", @_);
}


#./test.pl
use strict;
use warnings;
use lib qw(./lib);
use Hogehoge;

my $obj = Hogehoge->new({foo=>"abc", baa=>456}); #オブジェクト生成と初期化
print $obj->foo, "\n"; #getter:「abc」と表示
print $obj->baa, "\n"; #getter:「456」と表示

$obj->foo(11111); #setter:「11111」とセット
print $obj->foo, "\n"; #getter:「11111」と表示


毎回、内容の、変わらないbless部分とgetter/setter部分を書くのは
めんどくさ。
そんなわけで、Class::Accessor::Fastモジュールの登場。
上記と同じことは下記でOK
#./lib/Hoge.pm
package Hoge;
use strict;
use warnings;
use base qw(Class::Accessor::Fast);
__PACKAGE__->mk_accessors( qw(baa foo) );
1;


超すっきりですね。
オブジェクトを生成したりセットしたり書き換えたりってのは何も変わらないです。
便利便利ですね。
最初の書き方だと変数が増えるたびに
sub foo{
my $self = shift;
$self->accessor("foo", @_);
}

のようにaccessorメソッドにアクセスするためのメソッドが必要でしたが
今度は、
__PACKAGE__->mk_accessors( qw(baa foo) );

mk_accessorsに増やす変数名を追加するだけですね。