Perl中的$ ENV {$ variable}

mic*_*l_J 3 perl environment-variables

无论如何,在Perl中是通过$ ENV {$ variable}扩展变量吗?

我在外壳程序中导出了“ a = T”和“ T = b”,并运行了Perl脚本,其中打印了“ $ ENV {$ a} \ n”,但没有打印任何内容。我想“ b”可以打印,那我应该在Perl中怎么做?

zdi*_*dim 12

您应该将这些环境变量链接起来,所以

$ENV{ $ENV{a} };
Run Code Online (Sandbox Code Playgroud)

注意:不是,$a而是a,诸如此类$ENV{USER}。它使用具有当前环境的哈希值%ENV(请参阅perlvar),因此键是环境变量的名称。


显然,在中使用Perl变量(用于shell变量的名称)很有趣%ENV,而不是上面的字符串文字。在这种情况下,我们需要以某种方式将该shell变量(其名称或值)传递给Perl程序,以便将其存储在变量中。不能直接使用它。

顺便说一句,将变量从shell传递到Perl的方法之一就是通过导出变量,然后通过来使变量可用%ENV。但是,它也可以照常通过命令行传递。假设使用Perl单行代码(在Shell脚本中很常见),我们有两种方法来传递

  • 作为参数,perl -we'...' "$var"在这种情况下可以在@ARGV

  • 通过-s命令开关perl -s -we'...' -- -shv="$var"可以$shv在单行代码中使用值设置变量$var。该--标志的争论开始。

这个帖子的细节,也许这其中的另一个,更复杂,例如。

注意  注释询问如何传递变量的名称(字符串a),而不是其值($a)。对于我来说,这似乎不是最好的设计。如果由于某种原因变量的名称需要被通过周围然后是有意义的商店在一个变量(var="a"),并通过该变量,如上面。

但是,如果确实要传递名称本身的想法,则改为这样做,因此

perl -we'...' "a"
perl -we'...' -s -- -shv="a"
Run Code Online (Sandbox Code Playgroud)

其余部分相同,并%ENV使用分配了输入的变量。

如果使用完整的Perl脚本(而不是单行),则使用Getopt :: Long很好地处理广告。


 一条评论询问有关将shell变量的名称传递给Perl变量的方法-因此是a从OP 传递,而不是从其value 传递$a。我对它的效用有些不确定,但它当然是可能的。

然后,如何将变量从shell传递到Perl的两种方式不同。