DB周りのモジュールを開発している場合、テストDBにSQLiteを使う事が良くあります。
その際、普通であれば以下のようなテストコードを書くと思います
use Test::More tests => 1;
use DBI;
do {
# SQLiteで使うファイルを指定
my $dbh = DBI->connect('dbi:SQLite:./test.db','','');
$dbh->do(q{CREATE TABLE foo (id INT, name TEXT)});
$dbh->do(q{INSERT INTO foo (id, name) VALUES (10,'nekokak')});
my $sth = $dbh->prepare('SELECT * FROM foo');
$sth->execute;
my $row = $sth->fetchrow_hashref();
ok $row;
# 後始末としてファイルを削除
unlink './test.db';
};
しかし、エラーが発生した場合、最後のunlinkが実行されずに、test.dbファイルが残ってしまい、 テストスクリプトを再度実行すると、CREATE TABLEの部分でエラーが発生してしまいます。
SQLiteではファイル名を指定しない場合、ファイルを作らずオンメモリで処理できるので、 テストコードを書く際はファイルを指定しないようにすると良いでしょう。
use Test::More tests => 1;
use DBI;
do {
# SQLiteで使うファイルを指定せずオンメモリで処理
my $dbh = DBI->connect('dbi:SQLite:','','');
$dbh->do(q{CREATE TABLE foo (id INT, name TEXT)});
$dbh->do(q{INSERT INTO foo (id, name) VALUES (10,'nekokak')});
my $sth = $dbh->prepare('SELECT * FROM foo');
$sth->execute;
my $row = $sth->fetchrow_hashref();
ok $row;
};
このようにファイルを指定せずに書けば、unlinkも必要なく、ゴミファイルが残る心配もありませんね。
次は zigorou さん。