nDiki

2012年10月3日 (水)

ついカッとなって Perl で %ENV を tie した

「ある Perl スクリプトで、ある環境変数を使ってる可能性があるのだけれどどこでどう使ってるのかわかなくて」と言われたので、どこで %ENV から値を読んでいるか探してみることにした。なんか簡単にフックできなさそうなので、ついカッとなって %ENV を tie した。

だいたいこんな感じ。

 #!/usr/bin/perl
 
 use warnings;
 use strict;

 package CarpFetchHash;
 use Carp qw/carp/;

 sub TIEHASH {
   bless {%ENV}, shift;
 }

 sub FETCH {
   carp 'FETCH: $ENV{' . $_[1] . '}';
   $_[0]->{$_[1]};
 }

 # 必要なら EXISTS, FIRSTKEY NEXTKEY も

 package main;

 tie %ENV, 'CarpFetchHash';

 print $ENV{PATH};

環境変数に連動している %ENV (のリファレンス)自身にはさすがに tie できないので (TIEHASH で \%ENV を tie しようとすると Self-ties of arrays and hashes are not supported っておこられる)、%ENV の値をコピーした別の無名ハッシュオブジェクトに %ENV を tie する形になっている。

tie %ENV, '...' した後は、$ENV{$key} から値を取るたびに、どの行で使われたか carp してくれる。

これだと %ENV 経由で環境変数そのものは変更できなくなるんだけれど、読み込みしかしていないようなスクリプトならだいたいうまくいってそう(もし getenv(3) とか直接使ってると駄目だけど)。

スポンサード リンク
[ 10月3日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィでマネージャー・PO をしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

follow us in feedly

※内容は個人的見解であり所属組織とは関係ありません。

月別インデックス
Process Time: 0.132088s / load averages: 0.73, 0.51, 0.38
nDiki by WATANABE Yoshimasa (Naney, Google profile)
Powered by DiKicker