在Perl中是不是通过$ ENV {$ variable}扩展变量?
我在外壳程序中导出了“ a = T”和“ T = b”,并运行了Perl脚本,其中打印了“ $ ENV {$ a} \ n”,但没有打印任何内容。我想“ b”可以打印,那我应该在Perl中怎么做?
答案 0 :(得分:12)
您说的那些环境变量应该被链接起来,所以
$ENV{ $ENV{a} };
注意:不是$a
,而是a
,例如$ENV{USER}
等。它使用具有当前环境的哈希值%ENV
(请参见perlvar),因此,键是环境变量的名称。
在%ENV
中使用Perl变量(对于shell变量的名称为†)显然是令人感兴趣的,而不是上面的字符串文字。在这种情况下,我们需要以某种方式将该shell变量(其名称或值)传递给Perl程序,以便将其存储在变量中。不能直接使用它。
顺便说一句,将变量从shell传递到Perl的方法之一就是通过导出它,然后通过%ENV
使它可用。但是,它也可以照常通过命令行传递。假设使用Perl单行代码(在Shell脚本中很常见),我们有两种方法可以通过
perl -we'...' "$var"
作为自变量,在这种情况下,它在@ARGV
通过-s
command switch,perl -s -we'...' -- -shv="$var"
,在单行代码中设置$shv
变量,值为$var
。 --
标志着参数的开始。
有关详细信息,请参见this post,有关其他示例,请参见this one。
注意。一条注释询问如何传递变量的名称(字符串a
)而不是其值($a
)。对于我来说,这似乎不是最好的设计。如果出于某种原因需要传递变量名,则将那个存储在变量(var="a"
)中并如上所述传递该变量是有意义的。
但是,如果确实要传递名称本身的想法,请改用该名称,
perl -we'...' "a"
perl -we'...' -s -- -shv="a"
其余部分相同,%ENV
使用分配了输入的变量。
如果使用了完整的Perl脚本(而不是单行代码),则使用Getopt::Long可以很好地处理订单。
†有一则评论询问将shell变量的 name 传递给Perl变量-因此a
来自OP,而不是其值$a
。我对它的效用有些不确定,但它当然是可能的。
将变量从shell传递到Perl的两种方法在传递的内容上有所不同。