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;

PODもないけど、見れば多分わかるでしょ。sysopenしてflockするだけだし。誰かPerl詳しい人いないかなぁ。