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

Tom*_*Tom 7 bash perl

我可以做数学

perl -e 'print 5253413/39151' -l
Run Code Online (Sandbox Code Playgroud)

但是我不太了解如何利用Perl使用我自己的预定义bash变量进行数学运算的能力.我试过了

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

但它不起作用

Bor*_*din 12

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

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

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

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

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

  • +1; 还值得一提的是为命令定义环境变量的更简洁,特殊的一次性方法:`var1 = 5253413 var2 = 39151 perl -E'说$ ENV {var1}/$ ENV {var2}'` (5认同)

pil*_*row 6

两种不太常见的方法可以使用长期的perl功能.

第一个是核心模块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
Run Code Online (Sandbox Code Playgroud)

请注意,变量需要存在于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
Run Code Online (Sandbox Code Playgroud)

awk用它的-v开关做了类似的事情.