すごい単純なものですが、なんだかんだ6時間ぐらい程かかったので
やっぱりPGは尊敬するなぁとつくづく感じました。
作っている間、不完全燃焼のところがいくつもあったけど、触って
いくうちに覚えていこうというスタンスなので、とりあえず細かい
ところは気にしないで、手を進めていきました。
Perlはメンテナンス程度に触ったことがあるぐらいで、ほぼ素人
の状態です。
VMware → CentOS → Perl のインストールからはじめたので
結構時間かかってます。
考え方
①Perlで株価を表示しているWEBサイトへアクセス。
②現在価格を取得して日付とともにCSVファイルへ追記する。
③これをCronで夜に1回だけ動かす。
まだ②までしかできてないけど、③はすぐできそうなので、一旦休憩。
以下実際の成果物
#!/usr/bin/env perl use strict; use warnings; use LWP::Simple; ### utf8のERRORが出るので、とりあえずこれ入れたら解決した。 binmode(STDOUT, ":utf8"); ################################################################### # 本日の日付を取得する。 ################################################################### my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime; #localtime関数からは1900年から数えた年が返却される。 $year += 1900; # 月は0から始まるので、1を加える $mon++; # 日曜日は0 my @day_of_week = qw/日 月 火 水 木 金 土/; print "$year\-"; print "$mon\-"; print "$mday\t"; ################################################################## # XXXの株価ページからYYY社の株価を取得する ################################################################## my $url = 'http://XXX株価が表示しているページXXX'; # LWP::Simpleの「get」関数を使用 my $html = get($url) or die "Couldn't get it!"; #$htmlを一行ずつ、配列に格納する my @lines = split m{\n}, $html; # foreachで処理する前に変数を宣言しておかないとERRORになるので、適当にここで宣言 my $value = 0; foreach (@lines) { # 該当の文字列が部分一致する箇所をif文でマッチさせる if(/X部分一致させたい文字列X/){ $value = "$_"; }; }; ### 正規表現で、数値のみが残るように、置換する。 $value =~ s/^.*?(\d+).*$/$1/; print "$value\n"; open(FH,">> RESULT-xxx.csv"); print FH "$year\-"; print FH "$mon\-"; print FH "$mday\t"; print FH "$value\n"; close(FH);
やってみて
●my ~ で変数定義しないといけなかったっけ?って思ってたら、
use strict;
を使ってるからなんやな。これはスペルミスを防ぐものだと思う。
●utf8のエラーが出たので、ぐぐって荒療治しているけど、
次回までには理解して何とかしよう。
●ファイルハンドルの概念がいまいちよくわからん。
●LWPというものをはじめて知った。このPerlのモジュールを
使わないと、WEBサイトへGETするのがPerlでは難しいと思われる。
●if文の条件パターンになぜか2byte文字が使えなかった。
【課題】
●数値への置換が1,000とかの表記だとうまくいかない。コピペしてきただけなので要確認。
次もなんかぼちぼちやっていこう。