読者です 読者をやめる 読者になる 読者になる

We All Get Old - Naskin Diary

Yet Another My Life On The Web

ヴィジュアル系sleep関数 - vsleep for Perl

八苦(Hack)

残り秒数をカウントダウンしながら sleep() する地味なヴィジュアル系関数 vsleep()Perl 版が出来ました(パチパチ、ワーワー

使い方

# DEBUG が真値のときだけカウントダウンします、偽値のときは通常の sleep() 動作
use constant DEBUG => 1;

# vsleep を use してください
use vsleep qw(vsleep);

# 呼び出し方は普通の sleep() と一緒
vsleep(123);

サンプルコード

#!/opt/local/bin/perl

use strict;
use warnings;
use constant DEBUG => 1;
use vsleep qw(vsleep);

print "before sleep\n";
vsleep(123);
print "after sleep\n";

# エラーです><
vsleep("a1");

新しく体験したこと

ボット作りで Perl と格闘していたんだけどモジュール化する上でいろいろ覚えることがあった。

標準出力のバッファ無効化

C言語で作った vsleep() を Perl でも出来るかなとぐぐってみたら、標準出力のバッファの無効化は「$| = 0;」で出来ると知った。
最初に「$l(エル)」と書いてしまい warnings か strict に怒られてしまった(汗

unlessとか

Perl の書き方を調べている時に知ったこと。
命令を書いてから後ろに if とかの判定文を書けたり、判定が偽となるときに処理をしたいときは if じゃなくて unless とか新鮮だった。


ここで後ろに書く必要があるのかと思いつつ参考にしたところが同じような書き方をしていたので真似してみた(汗

croak("Argument \"$sec\" isn't numeric.") unless ($sec =~ /^[0-9]*$/);

unless は手元にある「初めてのPerl(リャマ本)」にも書いたからちゃんと読んでない証拠だ(苦笑

正規表現(桁数処理)

サブルーチン内で桁数を算出しているのだが正規表現の「tr/0-9//」だけで桁数を知ることが出来た。
C言語の時は10をべき乗しながら割り算していく関数まで作ったのに。。。

$_ = $sec;
my $digit = tr/0-9//;
Croak

vsleep() に文字とかを渡したときに、sleep()と同じように呼び出し元の何行目がおかしいよと警告を出す方法。
これは「Perlオブジェクト指向プログラミング:警告を出してみる」が参考になった。

Exporter

モジュール化したのはいいけど呼出し方が「VSLEEP::vsleep(123)」(最初はパッケージ名を大文字で書いてた)と書かなくといけなくて面倒だった。


HTTP::Request::Common の GET() や POST() みたいにサブルーチン名だけで書けるようにしたいと思って、Common.pm を読んでみたら「require Exporter;」と書いてあったのでぐぐってみたら「まえがき | Smart -Web Magazine」を見つけた。


そのままだと上手く動かなかったので CPAN の Exporter のページも参考にして実装、vsleep() だけで呼び出せるようになった。