2016-01-19 52 views
5

我可以做數學題一樣如何讓命令行Perl接受shell變量?

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 

但它不工作

+0

它不起作用的原因是你的'var1/var2'只是Perl的文本。即使將其更正爲「$ var/$ var2」後,腳本也無法看到這兩個變量是在調用腳本的shell中定義的。您必須以某種方式將它們的值傳遞給腳本(例如,作爲環境變量,請參閱答案)。 – reinierpost

回答

11

沒有做到這一點有兩種途徑。

  • 在Perl代碼可以使用%ENV內置散列訪問環境變量被從外殼出口

    $ export var1=5253413 
    $ export var2=39151 
    $ perl -E 'say $ENV{var1}/$ENV{var2}' 
    134.183366963807 
    
  • 您可以使用shell插設備插入一個shell變量的值寫入一個命令

    這是最好的做法參數到perl單行而不是我直接ntroducing值到代碼

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

+1;還值得一提的是爲命令定義環境變量的一種更簡潔的臨時方法:var1 = 5253413 var2 = 39151 perl -E'say $ ENV {var1}/$ ENV {var2}'' – mklement0

+1

@ mklement0 :我曾考慮過包括這個,但認爲它比Perl更關注shell技術。但回想起來,我猜這就是這個問題的全部內容。我會留下您的評論來代表它。謝謝 – Borodin

+1

順便說一下,最快(也是最骯髒)的方法就是'perl -e'print'$ var1/$ var2 -l' – reinierpost

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類似的東西。

+0

環境變量也可通過全局'%ENV'哈希獲得; 'shell#export FOO = BAR && perl -E'say $ ENV {FOO}'' – Joshua

+0

@Joshua,當然,但許多perl黑客和管理員需要單線程只是(太)[太急躁]( http://c2.com/cgi/wiki?LazinessImpatienceHubris)鍵入'$ ENV {this}'和'$ ENV {that}'。 :) – pilcrow

+0

這是一個非常整潔的想法,我幾乎想爲它投票作爲答案。但是,不會只使用雙引號工作很好嗎?出於某種原因,這個答案被刪除了,但有人說你可以做'perl -e'print $ var1/$ var2「-l' – Tom

相關問題