如何让命令行Perl接受shell变量?

xxe27gdn  于 2022-11-15  发布在  Perl
关注(0)|答案(3)|浏览(230)

我的数学就像

perl -e 'print 5253413/39151' -l

但是我不太明白如何利用Perl的能力来处理我自己预定义的bash变量。

var1=$(some wc command that yields a number); var1=$(some wc that yields another number)
perl -e 'print var1/var2' -l

但它不起作用

cfh9epnr

cfh9epnr1#

有两种主要的方法可以做到这一点。

  • 在Perl代码中,您可以使用%ENV内置散列来访问从shell * 导出 * 的环境变量
$ export var1=5253413
$ export var2=39151
$ perl -E 'say $ENV{var1}/$ENV{var2}'
134.183366963807
  • 可以使用壳插值工具将壳变量的值插入到命令中

这最好作为perl单行程序的 parameters 来完成,而不是将值直接引入代码

$ var1=5253413
$ var2=39151
$ perl -E '($v1, $v2) = @ARGV; say $v1/$v2' $var1 $var2
134.183366963807
cbjzeqam

cbjzeqam2#

有两种不太常见的方法利用了长期存在的perl特性。
第一个是core module Env,它将进程环境变量与perl变量联系起来:

sh$ export VAR1=1000
sh$ export VAR2=33
sh$ perl -MEnv -E 'say $VAR1/$VAR2'           # imports all environ vars
333.333333333333
sh$ perl -MEnv=VAR1,VAR2 -E 'say $VAR1/$VAR2' # imports only VAR1, VAR2
333.333333333333

注意,变量需要存在于perl进程继承的环境中,例如上面的export VAR,或者显式地用于单个命令(如FOO=hello perl -MEnv -E 'say $FOO')。
第二种也是更模糊的方法是使用perl的-s开关从命令行设置任意变量:

sh$ VAR1=1000
sh$ VAR2=33
sh$ perl -s -E 'say $dividend/$divisor' -- -dividend=$VAR1 -divisor=$VAR2
333.333333333333

awk对它的-v开关做了类似的事情。

lnvxswe2

lnvxswe23#

我相信问题的实质是传递变量而不导出ENV变量。
除了使用perl -s-e expression -perlvar=瓦尔之外,下面的代码还使用了另外两种机制将变量传递给perl。

a=x; b=N; c=z;
b=y perl -e '$pa='$a';'  -e "\$pc=$c;" -e 'print "$pa$ENV{b}$pc\n";'
echo $a$b$c

传递a和c是一样的,只是引号不同。当使用链式表达式传递时,像这样,用分号结束表达式是很重要的;因为它们在最后会流入一个表达式。
B的传递是由ENV完成的,但它不是使用导出的值,而是通过在同一命令行上的命令之前给出赋值,直接传递到perl的ENV中。
最后,echo命令强调了shell对$B的定义是如何保持不变的。
通过使用B的传递机制,我们得到了一个更安全的解决方案,因为无法检查进程的ENV数据中的值,并且在命令行参数列表中看不到它。

相关问题