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

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

File::Spec の catfile の引数

CPAN モジュールのレイアウトにした(内部向けの) Perl モジュールを書いていたら、File::Spec(::Functions)の catfile を使っているコードで、

Use of uninitialized value $file in concatenation (.) or string at /usr/lib/perl/5.10/File/Spec/Unix.pm line 102.

とかいう困ったエラーがテストコード実行中に出てしまって悩んだ。

おかしいのは、普通に

prove -I lib

とか

perl -I lib t/001_hoge.t

みたいにすると、さっきのメッセージは出ず、モジュールディレクトリ上で、

make test

を実行するとさっきのエラーが出る、というところ。

あれこれ原因を調べたところ、(すげー極端な例ですが)

#!/usr/bin/perl

use strict;
use warnings;

use Test::More;
use File::Spec::Functions qw(catfile);

is( catfile("/tmp", undef), "/tmp/" );

done_testing();

みたいな catfile の実行の仕方をすると出るみたいです。

実際はテストコード上ではなく、モジュール側で catfile しているので、catfile の呼び出し側で undef かどうかを事前にチェックするのがよさそうです。