【问题标题】:$ENV{$variable} in perlperl 中的 $ENV{$variable}
【发布时间】: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


【解决方案1】:

你说的那些环境变量应该是链式的,所以

$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 switchperl -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=T”是否在当前 shell 和我的 Perl 脚本中导出: $test=a;打印“$ENV{$ENV{test}}”;然后我运行这个脚本,但它什么也没打印。你能再帮忙吗?
  • @michael_J 啊......不,不能那样做——那个 shell 的 environment 变量 a%ENV 哈希中提供,作为一个键。但是要将它用作 Perl 脚本中的“普通”变量,您必须以某种方式将其传递给脚本;不能使用a$a。实际上,将变量从 shell 传递到 Perl 脚本的一种方法就是使用环境(您在 shell 中导出变量,然后 Perl 脚本可以通过%ENV 使用它)。或者,您可以将其作为脚本的参数传递(通过两种方式)
  • @michael_J 有关如何将 Bash 变量传递给 Perl 单行程序,请参阅例如 this postthis post(也许 this 也很有用)。如果您调用完整的 Perl 脚本(不是单行脚本),那么我会取消所有这些,只需通过 Getopt::Long 很好地使用命令行参数
  • @michael_J 在我的回答中添加了 cmets。
  • @michael_J 更新/编辑了添加内容,讨论了传递变量的 name
猜你喜欢
  • 2017-05-27
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-04-07
  • 2018-08-21
  • 2015-01-11
相关资源
最近更新 更多