%ENV

哈希 %ENV 包含你的当前环境。在 ENV 中设置一个值会更改你随后 fork() 出来的任何子进程的环境。

从 v5.18.0 开始,存储在 %ENV 中的键和值都被字符串化了。

my $foo = 1;
$ENV{'bar'} = \$foo;
if( ref $ENV{'bar'} ) {
    say "Pre 5.18.0 Behaviour";
} else {
    say "Post 5.18.0 Behaviour";
}

以前,只有子进程接收字符串化的值

my $foo = 1;
$ENV{'bar'} = \$foo;

# Always printed 'non ref'
system($^X, '-e',
       q/print ( ref $ENV{'bar'}  ? 'ref' : 'non ref' ) /);

之所以会发生这种情况,是因为你无法真正与外部进程共享任意的数据结构。