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

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

基本的には使いたくない

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

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

執筆者:

関連記事

Pipenv vs Poetry

1. はじめに Pythonでお仕事していると、どうしても、環境設定を行う必要があります。 本番環境で動作するように、設定しなければいけないからです。 いろんな状況はあるでしょうが、私がかかわるプロジ …

神奈川県横浜市神奈川区のワクチン接種地図作った

作ってみた。東白楽駅を真ん中にしてみました。なんとなく真ん中な感じなので。 データ元 以下のテキストデータからゴニョゴニョしてます。 https://www.city.yokohama.lg.jp/k …

Nuxt.js + Element + Responderでのtableサンプル作成

1. はじめに 最近、Webアプリケーションを作成する仕事が、少しずつですがあります。その際に使用するのは、殆どの場合「テーブル」です。 素のtableタグを駆使して作成した場合、テーブル内のセルにも …

小ネタ: Python のdataclass でNone or “”を使わないJSONデータを定義する

PythonをREST APIのクライアントとして作成する際、dataclassesを使用しようと思いました。型が見た瞬間分かるし、しっかりしているからです。 でも、そのREST API は&#822 …

svelteをチュートリアルしてみる

年末の休みは、svelteのチュートリアルをしてみました。なんとなくやはりそう?なので。 svelteとは Webアプリのフロントエンド(UI)用フレームワークです。要するにReactみたいなもんです …

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