tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

perl

配列の差

「配列の差」ってたまに欲しくなりませんか?ならないですか。そうですか。オイラはたまに欲しいときがあります。「パスワードの自動生成するけど、ある特定のアルファベットを除きたい」とか、なんかのチェックをするときに、「全リストを取得してからいく…

Time::Fake もいいけど、これからは Test::MockTime だね

なんとなく、cpan の RSS 更新フィードを眺めていたら、Test::MockTimeというモジュールを見つけました。Time::Fake と同じように、Perl の時計を設定変更しちゃうモジュールなのですが、こいつは「set_fixed_time()」というメソッドを持っていて、文字通り…

STDIN/STDOUT を使うテスト その2

STDIN/STDOUT を使うテストの続き。id:gfx さんより、トラバで、PerlIO の IO::scalar を使う方法を教えていただきました。 IO::scalarでIOのキャプチャ - use GFx::WebLog; 標準モジュールのIO::scalarでもIOキャプチャできますよ。 と、言うわけで私も試し…

Perl は終わりじゃないと思う

もう流行は終わったっぽいけど、一応参戦しとくか。Perlはもう終り? | | プログラマ2.0日報 | あすなろBLOG 1. 言語仕様が汚い。厳格にはサブルーチンの「引数」という概念がないし、変数はすべてグローバルで特に宣言した場合だけローカルになる...という…

日付変更線(?)

日付の変わり目が、0時だと困ることがあります。たとえば、この「はてなダイアリー」は、深夜にエントリを書く人(オイラみたいなコンピュータ屋さんに多いだろうね)を想定して、日付の変わり目がデフォルトで 5時(だっけ?)に設定されています。ほかにも、テ…

STDIN を使うテスト

前回の続き。ブクマコメで、id:kits さんより、 STDINは local *STDIN = *DATA; もできそう。 とのご指摘。確かに出来そうなので試してみました。 #!/usr/bin/perl use strict; use warnings; use Test::More "no_plan"; sub add { my $result = 0; while( <STDIN> </stdin>…

STDIN/STDOUT を使うテスト

仕事メモ。インタラクティブなコンソールアプリケーションだと、STDIN/STDOUT を使ったやりとりが発生します。こういうのをテストするときに、いままでは、 { local *STDOUT; open(STDOUT, '>', 'stdout.txt') do_something(); #STDOUT を使う何か close(STD…

オイラもPerlプログラマーになりたいなぁ。。。

Perlプログラマーの皆さん - Perl入門〜サンプルコードによるPerl入門〜に、Perl な人々の blog が沢山掲載されてます。オイラもPerlプログラマーに仲間入りしてみたいなぁ...。と言ってみるテスト。 追記(2008/12/20) ほんとに追加してもらえました! perlco…

最近のお仕事の話

12月のお仕事は当初思ってたよりは忙しくなかったのですが、ちょっと最近別件でバタバタしてました。さてさて、最近のお仕事のお話。今やっている仕事は主に2スレッドあるんだけど、1つは日常業務なので省略。もう1つの方がちょっと野心的なプロジェクトで、…

Perl のテスト機構を欺く

#!/usr/bin/perl use strict; use warnings; use Test::More tests => 1; print "a"; ok(1); # 絶対通るはずなんだけど... ok の引数が 1 だから、絶対に通るはずのテストです。でもコレが通らないんだ。 % prove a.t a.... Failed 1/1 subtests Test Summar…

Net::FTP の転送モードと転送速度

前にもはまったんだけどねぇ。Perl の Net::FTP のデフォルトの転送モードは ascii なんです。で、ascii モードで転送すると遅いよ、ってのが今日のお話。普通の FTP で 1GB のデータを送ると 20秒ちょいで終わるのに、Net::FTP を使うと1分くらいかかって、…

古いコードのリファクタリング

ずいぶん期間が空いてしまった。。。古いコードをテストコードを書きつつ、モダンな感じに書き換えていくというこの企画。お題は前回同様 my_prog.pl を使います。リファクタリングでやることは簡単、というか大体決まっています。 use strict/warnings 化 …

exit を捕まえる

昨日、exit しちゃうとテストコードで例外捕まえられないよー、と書きましたが、何とかする方法を見つけました。exit を die で置き換えちゃえばいいんです。 use strict; use warnings; BEGIN { *CORE::GLOBAL::exit = sub() { die "exited\n"; }; } print …

オプション解析をテストする

前に書いたように、レガシーコードを再構成する場合、テストコードを書かないと容易に死んでしまえます。それじゃあ困るので、テストコードをちゃんと書きます。お題は前回の my_prog.pl を使います。最終ゴールも前回のコードとします。 #!/usr/bin/perl -w…

getopt の裏技的使い方

時々、他人の書いたソースコードをメンテナンスすることがあります。で、最近実際にメンテする機会があったのですが、そのコードがオプション解析を自前でやってました。気味が悪いので、Getopt::Std あたりを使うように改めたいと思います。 (ちょっと古く…

Perl のテストについて

改訂版を書きました。よろしければそちらをご参照ください。 Perl のテストについて(2011年改訂版1) 0. 前提 0.1 対象 Perl は書けるが、Perl のテストコードを書いたことが無い人。 0.2 動作確認環境 % uname -a CYGWIN_NT-5.1 mypc 1.5.25(0.156/4/2) 2008…

Time::Fake 可愛いよ、Time::Fake、

以前にtech note で紹介した Time::Fake。使ってみました。時間をベースにディレクトリを作るクラスのテストに使ってみたのですが、ここではもうチョイ簡単に、「時間をベースにした名前を返すクラス」をテストしてみます。まずはテストされ側、name() は(現…