nDiki : 2012年10月03日

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) とか直接使ってると駄目だけど)。

スポンサード リンク

今日のさえずり: われわれ世代の SNS と言えば東京BBSですかね

2012年10月03日

  • 08:08 入力中にセッションタイムアウトしたり繁忙期に落ちてたりする人事システムみてると、YAPC::Asia Tokyo 2012 で @gosukenator 氏がトークしていた Git で評価管理する方法の方が100倍良さそうに感じる。
  • 09:45 着席。 (@ 株式会社ミクシィ (mixi, Inc.)) http://t.co/9Ui8hwer
  • 13:32 半袖さむいの。
  • 14:12 RT @as_tone: サラダになんかのってる! http://t.co/mUqCbX95
  • 14:23 Xperia GX にはとりあえず前の機種から入れていた AVG Mobilation Antivirus Free 入れてある。
  • 14:41 われわれ世代の SNS と言えば東京BBSですかね。
  • 15:35 C-x RET c いまだに覚えられない。
  • 19:55 ついカッとなって %ENV を tie した。
[ 10月3日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

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

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

月別インデックス
Process Time: 0.045013s / load averages: 0.24, 0.31, 0.33
nDiki by WATANABE Yoshimasa (Naney)
Powered by DiKicker