File::sysopen
sysopenのオーバーライドで致命的なミスしてましたorz
sysopen my $fh, $file, $mode;
みたいに呼び出したときは問題ないんだけど、
sysopen FH, $file, $mode;
みたいに呼ぶとエラーになるなんていうふざけたミス。普段上の書き方しかしないから今まで気付きませんでした。ベースは4月に書いてるのに。とりあえずifで切り分けて修正。あと、不要なところでSymbol.pmのqualify_to_refを呼んでいたところを削除とか、いろいろ細かい修正。あー、PODも書こうかなあ。英語書けないけど。
完成してないけど貼ってみる。
package File::sysopen; use strict; use warnings; use utf8; require Exporter; use Config qw/%Config/; use Fcntl qw/:DEFAULT :flock/; use Symbol qw/qualify_to_ref/; our $VERSION = '0.06'; our @ISA = qw(Exporter); our @EXPORT = qw(sysopen); sub croak { require Carp; goto &Carp::croak; } sub sysopen (*$$;$) { my (undef, $name, $mode, $perms) = @_; if (defined $_[0]) { # called as 'sysopen FH, $name, $mode' $perms ? CORE::sysopen qualify_to_ref($_[0], caller), $name, $mode, $perms : CORE::sysopen qualify_to_ref($_[0], caller), $name, $mode or croak "$!\n"; if ($Config{d_flock}) { ($mode & O_WRONLY || $mode & O_RDWR) ? flock qualify_to_ref($_[0], caller), LOCK_EX : flock qualify_to_ref($_[0], caller), LOCK_SH or croak "$!\n"; } } else { # called as 'sysopen my $fh, $name, $mode' $perms ? CORE::sysopen $_[0], $name, $mode, $perms : CORE::sysopen $_[0], $name, $mode or croak "$!\n"; if ($Config{d_flock}) { ($mode & O_WRONLY || $mode & O_RDWR) ? flock $_[0], LOCK_EX : flock $_[0], LOCK_SH or croak "$!\n"; } } 1; } 1;