【发布时间】:2020-03-01 10:53:15
【问题描述】:
是否在 Perl 中通过 $ENV{$variable} 扩展变量?
我在 shell 中导出了“a=T”和“T=b”,并运行了打印“$ENV{$a}\n”的 Perl 脚本,但没有打印任何内容。我想把“b”打印出来,那么在Perl中应该怎么做呢?
【问题讨论】:
-
你的意思是
$ENV{ $ENV{a} }...?
标签: perl environment-variables
是否在 Perl 中通过 $ENV{$variable} 扩展变量?
我在 shell 中导出了“a=T”和“T=b”,并运行了打印“$ENV{$a}\n”的 Perl 脚本,但没有打印任何内容。我想把“b”打印出来,那么在Perl中应该怎么做呢?
【问题讨论】:
$ENV{ $ENV{a} } ...?
标签: perl environment-variables
你说的那些环境变量应该是链式的,所以
$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)。这对我来说似乎不是最好的设计。如果由于某种原因需要传递变量的名称,那么将 that 存储在变量 (var="a") 中并传递该变量是有意义的,如上所述。
但如果这个想法确实是传递名称本身,那么就改为这样做,所以
perl -we'...' "a"
perl -we'...' -s -- -shv="a"
其余部分相同,%ENV 使用分配给输入的变量。
如果使用完整的 Perl 脚本(不是单行脚本),则使用 Getopt::Long 很好地处理参数。
† 一条评论询问有关将 shell 变量的 name 传递给 Perl 变量的问题——所以来自 OP 的 a,而不是它的值 $a。我有点不确定它的效用,但它当然是可能的。
如何将变量从 shell 传递到 Perl 的两种方式在传递的内容上有所不同。
【讨论】:
a 在 %ENV 哈希中提供,作为一个键。但是要将它用作 Perl 脚本中的“普通”变量,您必须以某种方式将其传递给脚本;不能使用a 或$a。实际上,将变量从 shell 传递到 Perl 脚本的一种方法就是使用环境(您在 shell 中导出变量,然后 Perl 脚本可以通过%ENV 使用它)。或者,您可以将其作为脚本的参数传递(通过两种方式)