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

时间:2016-01-19 01:27:17

标签: bash perl

我可以像

一样做数学
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

但它不起作用

2 个答案:

答案 0 :(得分:12)

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

  • 在Perl代码中,您可以使用%ENV内置哈希来访问从shell 导出的环境变量

    $ export var1=5253413
    $ export var2=39151
    $ perl -E 'say $ENV{var1}/$ENV{var2}'
    134.183366963807
    
  • 您可以使用shell插值工具将shell变量的值插入到命令

    这最好以perl one-liner的参数完成,而不是直接将值引入代码

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

答案 1 :(得分:6)

两种不常见的方法是使用长期的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 switch从命令行设置任意变量:

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

awk与-v switch做了类似的事情。