如何捕获%ENV的更改?

mmc*_*coo 7 perl environment-variables

我有一堆运行工具流程的脚本.就像Makefile一样但是在Perl中.

作为这些流程的一部分,Perl脚本设置了环境变量,并且它们发生的时间并不总是很容易知道,因此很难重现流程的各个阶段.

有没有办法挂钩%ENV,这样我可以在环境变化时注册一个回调?

我能和它联系吗?%ENV已经表现得像个平局.

后续行动:是的.你只是绑定它.

Rob*_*rog 9

噢.我刚刚得到了我的屁股.无论如何,据说存在一个监视器包,它允许您通过绑定监视对现有变量的更改.这听起来像一个有趣的问题,所以当我开始深入研究The Blue Camel中的"tie"文档时,没有定义现有变量会发生什么(即 - 是否保存了某个引用?).所以,我用Google搜索"perl tie"现有变量"".不幸的是,我发现的链接在社会上是不可接受的(盗版材料),所以我得到了相当多的打击,声誉明智.

祝你好运.

无论如何,只是为了澄清,它是在"高级Perl编程"的第9章,关于"领带"的章节.确保从信誉良好的网站购买副本:-)


jet*_*ero 4

这是可行的。我认为执行以下操作可能会导致性能损失,并且我确信我没有涵盖所有可能的情况,但这绝对应该让您开始。

use strict;
use warnings;

tie %ENV, 'change_noticer', %ENV or die $!;

$ENV{PATH} .= ":test";
print $ENV{PATH}, "\n";
delete $ENV{PATH};

package change_noticer;

use strict;
use warnings;
use Carp;
use Tie::Hash;
use base 'Tie::StdHash';

sub DELETE {
    my $this = shift;

    carp "deleting \$ENV{$_[0]}";
    $this->SUPER::DELETE(@_);
}

sub STORE {
    my $this = shift;

    carp "altering \$ENV{$_[0]}";
    $this->SUPER::STORE(@_);
}

sub TIEHASH {
    my $class = shift;
    my $this  = bless {}, $class;

    while( my ($k,$v) = splice @_, 0, 2 ) {
        $this->{$k} = $v;
    }

    return $this;
}
Run Code Online (Sandbox Code Playgroud)