ちょっとだけperlの機能修正をしたので、そのときに使用したライブラリについて書こうと思います。
perlのunconstant です。
use constantの解除
use constantとは固定値(普通の実装では大文字の変数)を指定するライブラリですが、これは、use constantを解除する機能です。つまり、その固定値を別の値にするライブラリになります。
具体例
具体例で説明してみます。例えば、perlで単体テストを書こうとした時、テスト対象の実装が以下のようにconstantにてファイルパスがフルパスで書いてあることがありえます。
use constant A=>'/usr/local/bin/B';
基本的にはいいのですが、単体テストをする際には、ファイルパスを本番のフルパスではなく、自分のホームディレクトリで動作させたい場合があります。そうでないと、別環境での単体テストをしたいときに障害になります。
例えば、 以下のようなconst.pm, a.pm, a.t, a.plの4ファイルがあったとします。
# const.pm package const; use constant P => "/usr/local/bin/bb"; 1;
# a.pm use lib "."; use const qw/P/; sub ab { print const::P; } 1;
# a.t use unconstant; use lib "."; use const; use constant *const::P => "/home/tanino/bb"; use a qw/ab/; ab();
# a.pl use unconstant; use lib "."; use a qw/ab/; ab();
とすると、a.pmで使用しているconst::Pを使用した、単体テストを記述する場合に、unconstantを使用した場合(a.t)と、unconstantを使用しない(a.pl)で以下のように結果が異なります。
$ perl a.t /home/tanino/bb $ perl a.pl /usr/local/bin/bb
const.pmでは、/usr/local/bbになっていますが、テスト内部ではPが/home/tanino/bbになります。つまり単体テストでは、Pを変更し、本番で使用する、/usr/local/bbではなく、/home/tanino/bbに変更できたことになります。よって本番とは別の単体テストを起動できます。
基本的には使いたくない
基本的には、あまり使いたくないライブラリではありますが、レガシーシステムでは使いたくなる場合もあるかと思い、自分の記憶がてら書いておきます。