「ある 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) とか直接使ってると駄目だけど)。
Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。
※本サイトの内容は個人的見解であり所属組織とは関係ありません。