スクリプトのお勉強 失敗談

unconstant – perlライブラリ

投稿日:

ちょっとだけ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に変更できたことになります。よって本番とは別の単体テストを起動できます。

基本的には使いたくない

基本的には、あまり使いたくないライブラリではありますが、レガシーシステムでは使いたくなる場合もあるかと思い、自分の記憶がてら書いておきます。

-スクリプトのお勉強, 失敗談

執筆者:

関連記事

顔画像のモザイク方法(python + OpenCV + face_recognition)

Python3での顔画像モザイク方法 python3での顔画像モザイクの方法を調べてみました。 仕事とは関係なく、単なる趣味だったりしますが。。 この内容で、Djangoと統合する予定です。 Open …

SimpleHTTPSAuthUploadServer というPython用モジュールを書いた

書いた動機 リモート開発になっているので、遠くのホストにあるファイルをお手軽に見たい、取ってきたいor編集したい、というニーズが、私の中であります。ftpなんか使わず、全部ブラウザでやりたいわけです。 …

vscodeのRemote Developmentで「権限がない」と怒られた時

小ネタです。 vscodeのRemote Developmentにてパスワードなしログイン vscodeは時々使うのですが、リモート開発するのにRemote Developmentが便利なので使ってま …

言語別ログイン機能パスワード保存処理方針

ちょっと前に、ログイン機能を作成した際、パスワードを暗号化するか、という議論を目にしたことがありました。 昔だと、「パスワードを暗号化しない」方で実装していましたが、最近はセキュリティが当たり前になっ …

React.js の Ant Design使ってみる(DateTimePicker編)

DateTimePickerサンプル DateTimePickerを使うサンプルで、いいのがなかなかないです。Dateだけとか、Timeだけってのはあるのですが。 ということで作ってみようと思いました …

google オプトアウト Click here to opt-out.