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

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での勘違い(if A:)

勘違い 小ネタです。 Pythonでは、以下のように書くことができます。 a = [] if a: print(“not empty!”) else: print(“empty!”) 結果は以下になり …

Githubからお告げ

Githubからお告げが来た お告げってのは大げさですが。 Github にpackage-lock.jsonを置いておくと、Githubが脆弱性検査をして、メールを知らせてくれます。 js-yaml …

Vue.js 導入編

1.はじめに 近年、web関係で「クライアントサイドJavaScript」というのがトレンドになっているそうです。 「クライアントサイドJavaScript」と、従来のWebアプリケーションとの違いは …

CentOS7 + Django2.2でSQlite3を使用する方法

そのままだとエラーになる 素のCentOS7で、SQLite3を使用して、Djangoアプリを起動すると以下のエラーになります。 File “/opt/webapps/django_upload/.v …

「Python3 メモ」 独自例外クラスからの値取得/変数の内容取得

忙しい。。 この時期でなぜか忙しく、ブログ書いてる暇ない。。のでメモ書き程度。そして、内容をよく忘れるやつ。。 python3の独自例外クラス 例外クラスからの値取得方法をいつも忘れます。ある関数or …

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