无论如何在 Perl 中通过 $ENV{$variable} 来扩展变量?
我在 shell 中导出了“a=T”和“T=b”,并运行了打印“$ENV{$a}\n”的 Perl 脚本,但没有打印任何内容。我想“b”可以打印,那我在Perl中应该怎么做呢?
最佳答案
你说的那些环境变量应该被链接起来,所以
$ENV{ $ENV{a} };
注意:不是
$a
但是 a
, 喜欢 $ENV{USER}
等等。这使用散列%ENV
(参见 perlvar ),它具有当前环境,因此键是环境变量的名称。在
%ENV
中使用 Perl 变量(用于 shell 变量的名称†)显然很有趣。 , 而不是上面的字符串文字。在这种情况下,我们需要以某种方式将 shell 变量、它的名称或值传递给 Perl 程序,以便将它存储在一个变量中;不能直接使用。顺便说一句,将变量从 shell 传递到 Perl 的方法之一正是通过导出它,然后通过
%ENV
使其可用。 .但是,它也可以像往常一样通过命令行传递。假设使用 Perl one-liner(在 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很好地处理 arugments。
† 一条注释询问如何将 shell 变量的名称传递给 Perl 变量 — 所以
a
来自 OP,而不是它的值 $a
.我有点不确定它的效用,但这当然是可能的。将变量从 shell 传递到 Perl 的两种方法在传递的内容上有所不同。
关于perl - perl 中的 $ENV{$variable},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58705017/