我可以做數學題一樣如何讓命令行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
但它不工作
我可以做數學題一樣如何讓命令行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
但它不工作
沒有做到這一點有兩種途徑。
在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
+1;還值得一提的是爲命令定義環境變量的一種更簡潔的臨時方法:var1 = 5253413 var2 = 39151 perl -E'say $ ENV {var1}/$ ENV {var2}'' – mklement0
@ mklement0 :我曾考慮過包括這個,但認爲它比Perl更關注shell技術。但回想起來,我猜這就是這個問題的全部內容。我會留下您的評論來代表它。謝謝 – Borodin
順便說一下,最快(也是最骯髒)的方法就是'perl -e'print'$ var1/$ var2 -l' – reinierpost
兩種不常見的方式來做到這一點化妝使用的長期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類似的東西。
環境變量也可通過全局'%ENV'哈希獲得; 'shell#export FOO = BAR && perl -E'say $ ENV {FOO}'' – Joshua
@Joshua,當然,但許多perl黑客和管理員需要單線程只是(太)[太急躁]( http://c2.com/cgi/wiki?LazinessImpatienceHubris)鍵入'$ ENV {this}'和'$ ENV {that}'。 :) – pilcrow
這是一個非常整潔的想法,我幾乎想爲它投票作爲答案。但是,不會只使用雙引號工作很好嗎?出於某種原因,這個答案被刪除了,但有人說你可以做'perl -e'print $ var1/$ var2「-l' – Tom
它不起作用的原因是你的'var1/var2'只是Perl的文本。即使將其更正爲「$ var/$ var2」後,腳本也無法看到這兩個變量是在調用腳本的shell中定義的。您必須以某種方式將它們的值傳遞給腳本(例如,作爲環境變量,請參閱答案)。 – reinierpost