2017年09月24日

nextとlastの使い分け

@last文を使うとループを抜けることができます。
Anext文を使うと次のループに進むことができます。
それに
last&nextの後ろに判断文を追記することが出来ます。
my @chars = qw/z z a b c d e f/;
forの処理.....
last if $char eq 'e';
次の処理.......

4:もし「$char」が'e'と同じならば"ループを抜ける"ので'e'以降の処理。すなわち'e','f'は処理されない
my @chars = qw/z z a b c d e f/;
forの処理.....
next if $char eq 'z';
次の処理.......

4:もし「$char」が'z'と同じならば"次のループに進む"ので'z'はスキップされる。すなわちはじめの2つの'z','z'は処理されない
また、if意外にもunlessも使えるのでコードを見やすくするためにはいろいろ使って見る
posted by トシ at 10:17| Comment(0) | Perl

2017年09月23日

Windos7からHTML::TreeBuilderを使ってPerlでスクレイピング

Strawberry Perl Portable Editionを使ってWindows7からウェブスクレイピングで悩んだのでそのまとめ
ではじめてLWP::UserAgent;とHTML::TreeBuilder;を使えば比較的簡単にPerlを使用してWebデータを引っ張ってくることが出来る事を勉強したのだが、ただ単純にコピペしただけでは文字化けになってしまった。
2017-09-23_15-19-25.jpg
まあWebから拾ってくる文字コードがたぶんUTF-8あたりでWindows7ではsjisかcp932で出力してやれば正常に出てくるバズ。
とタカをくくってプログラム作ったけど文字化けが止まらない。

PerlをWin7で使う場合には文字コードを厳密に理解して使わないと、文字バケが止まらなくなってしまう。
ググってみると同じ様な悩みの人がいて、解決した記事を見つけたのですが

これを更に参考にして、自分流でコードを書き直してみた

 
use strict;
use warnings;

# 文字列リテラルを flagged utf8 として扱うプラグマ
use utf8;
# デコード/エンコード のためのモジュール
use Encode;

use LWP::UserAgent;
use HTML::TreeBuilder;

# urlを指定する
my $url = 'http://www.yahoo.co.jp';

# IE8のフリをする
my $user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)";

# LWPを使ってサイトにアクセスし、HTMLの内容を取得する
my $ua = LWP::UserAgent->new('agent' => $user_agent);
my $res = $ua->get($url);
my $content = $res->content;

#ファイルの文字列をエンコードして読み込む(flagged utf8 に変換する/入力はutf8)
$content = decode('utf8', $content);

# HTML::TreeBuilderで解析する
my $tree = HTML::TreeBuilder->new;
$tree->parse($content);

# DOM操作してトピックの部分だけ抜き出す。
my @items = $tree->look_down('id', 'topicsfb')->find('li');
print encode('cp932',$_->as_text."\n") for @items;


文字コードをPerlで扱うためにフラグ付きUTF8で処理したらうまくいった。
# 文字列リテラルを flagged utf8 として扱うプラグマ
use utf8;
# デコード/エンコード のためのモジュール
use Encode;
で宣言をします。

Webでスクレイピングしてきた文字コードはutf8なので、utf8文字列(入力)→フラグ付きutf8へ(内部コードへ変換)します。
#ファイルの文字列をエンコードして読み込む(flagged utf8 に変換する/入力はutf8)
$content = decode('utf8', $content);

そうして、解析処理を行い最終出力でフラグ付きutf8からフラグ無しutf8へ変換し、最終出力でcp932へエンコードしてからPrintします
print encode('cp932',$_->as_text."\n") for @items;
こでれうまくWin7上での表示が出来ました。
続きを読む
posted by トシ at 15:14| Comment(0) | Perl

2017年08月27日

Acronis True Image 2017 ダウンロード版

2017-08-27_12-36-34.jpg

ソースネクストからAcronis True Image 2017が安いよというメールが届いた。このソフトはHDDのバックアップのソフトでパソコンのHDDが壊れるまえにクローンを取っておいたりするソフトである。
そもそも定価が¥4980が特価で¥1,780となり、割引券が使えたので¥922で購入することが出来た。


続きを読む
posted by トシ at 12:53| Comment(0) | 日記