我的数学就像
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
但它不起作用
cfh9epnr1#
有两种主要的方法可以做到这一点。
%ENV
$ 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
cbjzeqam2#
有两种不太常见的方法利用了长期存在的perl特性。第一个是core module Env,它将进程环境变量与perl变量联系起来:
Env
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开关从命令行设置任意变量:
export VAR
FOO=hello perl -MEnv -E 'say $FOO'
-s
sh$ VAR1=1000 sh$ VAR2=33 sh$ perl -s -E 'say $dividend/$divisor' -- -dividend=$VAR1 -divisor=$VAR2 333.333333333333
awk对它的-v开关做了类似的事情。
-v
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数据中的值,并且在命令行参数列表中看不到它。
3条答案
按热度按时间cfh9epnr1#
有两种主要的方法可以做到这一点。
%ENV
内置散列来访问从shell * 导出 * 的环境变量这最好作为perl单行程序的 parameters 来完成,而不是将值直接引入代码
cbjzeqam2#
有两种不太常见的方法利用了长期存在的perl特性。
第一个是core module
Env
,它将进程环境变量与perl变量联系起来:注意,变量需要存在于perl进程继承的环境中,例如上面的
export VAR
,或者显式地用于单个命令(如FOO=hello perl -MEnv -E 'say $FOO'
)。第二种也是更模糊的方法是使用perl的
-s
开关从命令行设置任意变量:awk对它的
-v
开关做了类似的事情。lnvxswe23#
我相信问题的实质是传递变量而不导出ENV变量。
除了使用perl
-s
-e expression -perlvar=瓦尔之外,下面的代码还使用了另外两种机制将变量传递给perl。传递a和c是一样的,只是引号不同。当使用链式表达式传递时,像这样,用分号结束表达式是很重要的;因为它们在最后会流入一个表达式。
B的传递是由ENV完成的,但它不是使用导出的值,而是通过在同一命令行上的命令之前给出赋值,直接传递到perl的ENV中。
最后,echo命令强调了shell对$B的定义是如何保持不变的。
通过使用B的传递机制,我们得到了一个更安全的解决方案,因为无法检查进程的ENV数据中的值,并且在命令行参数列表中看不到它。