Perl - CPAN - Time::HiResパッケージ

ここに掲載するものは、塚本さんにパッケージ化して頂いているZaurus用Perl 5.6.1に追加でインストールするPerlライブラリのTime::Hiresである。
ソースはここからダウンロードし、dev-img-1.3でセルフコンパイルした。
gcc 2.95はコードオプティマイズにバグを含んでいると言う話を聞いているので、Makefileからオプティマイズオプションを外してビルドした。

download:lib-perl-time-hires_1.86-1_arm.ipk

手始めの使い方は以下の通りである。

# 1.2秒待つ
use Time::HiRes qw(usleep);
usleep(1200000); # マイクロ秒(100万分の1秒)
# 2.7秒間のキー入力を待つ
use Time::HiRes qw(gettimeofday tv_interval);
use Term::ReadKey;
ReadMode(4);
print "hit any key ... ";
undef $key;
@curtm = gettimeofday;
while (tv_interval(\@curtm) < 2.7) {
    $key = ReadKey(-1);
    if (defined($key)) {
        last;
    }
}
ReadMode(0);
if (defined($key)) {
    print "press '$key'\n";
} else {
    print "no key\n";
}
# 5.3秒間に0.8秒毎のシグナルを受信する
use Time::HiRes qw(usleep ualarm gettimeofday tv_interval);
sub showtime {
    $t = gettimeofday;
    print $t, "\n";
}
$SIG{ALRM} = "showtime";
showtime; # 開始時間を表示
ualarm(800000, 800000);
@curtm = gettimeofday;
# 以下のwhileループについては※1を参照
while (($rel = 5.3 - tv_interval(\@curtm)) > 0) {
    usleep(int($rel * 1000000));
}
showtime; # 終了時間を表示


※1:本当は "usleep(5300000);" で済むはずだが、このバージョンのPerlではusleep内でシグナルが発生すると、残りの待ち時間があったとしてもusleepが終了してしまうため、別の方法で正確な時間を取らなければならない。

Zaurusではclock_gettime,clock_getres,clock_nanosleepはサポートしていない。
また、setitimerではITIMER_REALのみをサポートしている。

Time::HiResの詳細は以下をご覧頂きたい。
英語:http://search.cpan.org/~jhi/Time-HiRes-1.9705/HiRes.pm
日本語:http://perldoc.jp/docs/modules/Time-HiRes-1.55/HiRes.pod