Hatena::ブログ(Diary)

骨皮日記 RSSフィード

骨皮日記

2005-11-16

勉強中(2)

昨日書いた(今読んでる)リャマ本の前に、

すぐわかるPerl (Software Technology)

すぐわかるPerl (Software Technology)

を買って、この本からPerlを始めました。本を買うにあたっては、 id:naoya さんが2年前に書かれたエントリーお薦めの Perl 本をいくつか紹介」がすごく参考になりました。(というか、このエントリーを読んで、興味を持って、本を買って、Perlを始めたようなものです。)

「すぐわかるPerl」は、評判通りわかりやすくて楽しい本でした。なんだか物語を読み進めるような感じでページをめくることが出来ました。 Windows 環境ではなく、 Linux 環境(僕の場合は Turbolinux )で本に載っているプログラムを打ち込みながら勉強していったのもよかったと思います。(ただ、サンプルプログラムで度々、SpeedとかShimabukuroとかArakakiとか出てくるところだけはさすがに時代を感じさせられた。)

この本を読み終えて、これくらいのプログラムは作れるようになりました。

(もちろん人によってはもっとすごいプログラムも作れるでしょう。)

#!/usr/local/bin/perl -w

# hone -- 2つの時刻の間隔(分)を求める

(@ARGV == 2) or die "usage: $0 stime etime\nex: perl $0 8:30 11:30\n";

@tm = @ARGV;

print " $tm[0] - $tm[1] === ";

foreach (@tm) {

/([0-9]+):([0-9]+)/;

$m = $1 * 60 + $2;

@mm = (@mm, $m);

}

$mm[1] -= $mm[0];

print $mm[1]." min. ( ";

print $mm[1] / 60;

print " )\n";

シェルの画面で、2つの時刻を引数にして実行すると、

$ perl hone 22:26 23:11

22:26 - 23:11 === 45 min. ( 0.75 )

のような結果が得られます。

実際このプログラムは、自分の勉強時間をはてなグラフにつける際、勉強開始時間と終了時間からグラフへの登録値(0.75とか)を求めるのに使っています。

ところで、ふと振り返って(またもや) naoya さんの以前のエントリーPerlプログラマのレベル10 - Perlプログラミング救命病棟より」を見てみたら、いつの間にかPerlプログラマ:レベル3になっていました。やった! (JavaScriptとはだいぶ違う言語だと思うし、いちおう use strict に出会ったことはあるのでレベル2は越えたと思う。 use strict の意味はまださっぱり分からないけど。)

目標はレベル8で、CPANモジュール送って使ってもらえるようなPerlプログラマになりたいです。でも、ドラクエでいうと、Perlレベル3 は DQレベル10 くらいで、Perlレベル8 は DQレベル97 くらいじゃないかという気がする。道のりは遠く遠い。。

ところで、 Ruby言語の特徴を教えてもらっている(というか勝手日記を見て参考にさせてもらっている) id:kakkunpakkun さんに、上の時刻の間隔を求めるプログラムRuby で書くとどうなるのか、ちょっと書いてみてもらいたいなーなんて、このばとトラバをかりてお願いしてみます。(もちろんご都合のよい時に。)

なかだなかだ 2005/11/17 12:02 $ ruby -rtime -e ’t0, t1 = ARGV; min = (Time.parse(t1) - Time.parse(t0)) / 60; puts ”#{t1} - #{t0} = #{min} min. (#{min / 60.0})”’ 22:26 23:11
23:11 - 22:26 = 45.0 min. (0.75)

s_kandas_kanda 2005/11/17 18:20 おぉっと、なかださんありがとうございます。しかもなかなかのRuby使いとお見受け候。
こんなふうに1行で書けてしまうんですねぇ。 Ruby にも ; があったんですねぇ。でも、Time.parse() なんて関数(?)を使うのはズル...いや、便利ですねぇ。
t0, t1 = ARGV
はすごくシンプルで良さそう。 Perl でも、
($t0, $t1) = @ARGV;
と書けるけど、 foreach のことを考えなければこう書いた方が分かりやすいですね。

kakkunpakkunkakkunpakkun 2005/11/17 19:14 もう回答が出てますねー。でも、せっかく宿題(?)を出して頂いたので、ありがたい勉強の機会として自分なりに書いてみます!(時間をみつけて。。)

s_kandas_kanda 2005/11/17 21:07 kakkunpakkunさん、コメントありがとうございます。
Time.parse() を使わない方法でぜひ書いてみてもらえたらと思います。(便利な関数(?)あるんだから使えばいいじゃん云々の論議は別として。)
もちろん時間の都合のよい時に。