Perl入学式2013年第5回より 〜練習問題の最終問題:前編〜

ここ数日、連日更新できてます。1月に入ると烈火の多忙に入りそうなので、それまでにペース(プログラミング体力&習慣)をある程度身につけてしまっておきたいですが・・どうでしょうか。

さて、ここ数回の更新では、東京だと去る12/8、大阪だと12/21ですか、あたりに開催されましたPerl入学式2013年度第5回の内容を、復習というか、まあぼくはそれに参加できなくて、年明けの補講に行きたいと思っているのでその意味では予習、をしています。
資料は、こちら。
workshop-2013-05/slide.md at master · perl-entrance-org/workshop-2013-05 · GitHub

で、その第5回に関する前回までの記事の流れはこちら。

  1. Perl入学式in東京第5回練習問題よりcalc_string.pl - draft
  2. Mojoliciousのインストール(Perl入学式2013-第5回より) - draft
  3. mapとgrep(Perl入学式2013-第5回より) - draft
  4. ついにPerlでオブジェクト指向 - draft
  5. ついにPerlでオブジェクト指向・いろいろ補足編 - draft

はい。んで、今日はその流れのほぼ、最後でしょうか。
こんな問題です。
https://github.com/perl-entrance-org/workshop-2013-05/blob/master/slide.md#%E6%9C%80%E7%B5%82%E5%95%8F%E9%A1%8C

最終問題

  • 隣の人とペアを作ってぶつかり稽古(ペアプログラミング)をしましょう. 1台のPCで作業を行います
  • 以下の機能があるYAPCモジュールを実装してください
    • 来年のYAPC::Asiaは2014年8月28日から30日に開催予定です. 日付を教えてくれるモジュールを2人で作りましょう
    • YAPC::year()で年を4桁の整数で返します(テストをAの人が, コードをBの人が書きましょう)
    • YAPC::month()で月を2桁の整数で返します(テストをBの人が, コードをAの人が書きましょう)
    • YAPC::day()で日付を2桁の整数で返します(テストをAの人が, コードをBの人が書きましょう)
    • YAPC::is_yet()で開催前か開催後かを真か偽で返します(テストをBの人が, コードをAの人が書きましょう)
  • 最後の項目はテストもコードも結構難しいです! サポーターの人に「どうすればXXXXが出来る?」と聞きましょう

はい。ということで、順にやっていきます。

まあ、当然のことながら、というか、自習は一人でやっているので「ぶつかり稽古」はできないですね(笑)。できないですが、一人二役でやっていきます。

まず、「YAPC::year()」から「YAPC::day()」を作るところまで、一息にやってみます。

・・と、思ったんですが、今回はちょっと試したいことがありまして、前回までにあらかたモジュールの作り方の基礎を見てきたので、ちょいステップアップして、『雅なPerl入門』に掲載されていた「Minilla」で作ってみようかなと。

Minillaについては、こちら。
https://github.com/tokuhirom/Minilla
http://blog.64p.org/entry/2013/05/14/080423
http://perldoc.jp/docs/modules/Minilla-v0.6.4/lib/Minilla.pod
http://yellowstore.blogspot.jp/2013/05/perlminilla.html

『雅なPerl入門』についてはこちらをご参照ください。
http://kazhiramatsu.hatenablog.com/entry/2013/08/07/132842
http://blog.nobers.com/entry/2013-10-14-01.html
http://tsucchi.github.io/perl/2013/09/21/miyabina_perl/

インストールの仕方の詳細などは割愛しますが、まあ普通に

$ cpanm Minilla

としまして、その後、任意の場所に

$ minil new YAPC

としました。

すると、「YAPC」というディレクトリが出来て、その中に「lib」や「t」その他のファイルやディレクトリが出来て、「lib」の中に「YAPC.pm」が出来ると。
そこまで大体・・実行から数秒でしょうか。何が起こってるのかはほぼ一切わかりませんが、でも便利というかラクだな、と思いました。
何が起こってるかは、おいおい分かりたいと思っています。

で、あらためてその「YAPC.pm」を使って、上記の問題にぶつかりたいと思います。
とりあえず、こんな感じで・・

package YAPC;
use 5.008005;
use strict;
use warnings;

our $VERSION = "0.01";

sub year {
    return 2014;
}
sub month {
    return 8;
}
sub day {
    return 28;
}

1;

冒頭の2行、および「our $VERSION = "0.01";」というのは僕には(というかPerl入学式の資料的には)見慣れないのですが、見慣れないなりに、そのままにしています。

で、それを処理するファイル「practice.pl」を新たに、「YAPC」ディレクトリ内に(libディレクトリやtディレクトリと同階層)作りました。
こんな。

#!/usr/bin/env perl
use strict;
use warnings;
use YAPC;

print "Year: ".YAPC::year()."\n";
print "Month: ".YAPC::month()."\n";
print "Day: ".YAPC::day()."\n";

はい。で、実行するとこんな感じです。エンター!

Year: 2014
Month: 8
Day: 28

はい、どうでしょうか。最後のDayについては、実際のYAPC開催予定日は28日〜30日までということだったので、その辺も反映した方がいいのかちょっと悩みましたが、問題の方で「2桁の整数で」とありましたので、ひとまず28日のみとしました。

さてここからが、ややというか結構というかかなり難関だったのですが。
一応できた気がするのでそのままザラっと書いていきます。

・・と思いましたが、結構ひとつのエントリーとしては十分な長さな気もするので、明日に回す感じにしようかな・・ここから最後まで書くのもそれなりに時間使いそうだし・・

ということで、一旦ここまでにします。次回をお楽しみに!