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

Process Time: 0.142875s / load averages: 0.65, 0.48, 0.44