2016-01-19 14 views
5

posso fare matematica comeCome posso ottenere il comando da riga di comando Perl per accettare le variabili di shell?

perl -e 'print 5253413/39151' -l 

Ma non riesce quasi mai come approfittare della capacità di Perl per fare matematica con le mie variabili bash predefinite. Ho provato

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

Ma non funziona

+0

Il motivo per cui non funziona è che il tuo 'var1/var2' è solo testo in Perl. Anche dopo averlo corretto a '$ var/$ var2', lo script non può vedere che queste due variabili siano definite nella shell che chiama lo script. Devi passare i loro valori allo script in qualche modo (ad es. Come variabili d'ambiente, vedi le risposte). – reinierpost

risposta

11

Ci sono due modi principali per fare questo.

  • All'interno del codice Perl è possibile utilizzare il %ENV built-in hash per accedere alle variabili d'ambiente che vengono esportati dal guscio

    $ export var1=5253413 
    $ export var2=39151 
    $ perl -E 'say $ENV{var1}/$ENV{var2}' 
    134.183366963807 
    
  • È possibile utilizzare la funzione shell di interpolazione per inserire il valore di una variabile di shell in un comando

    Questo è meglio fatto come parametri al perl one-liner anziché a ntroducing i valori direttamente nel codice

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

+1; vale anche la pena menzionare il più conciso metodo ad hoc di definire le variabili d'ambiente per un comando: 'var1 = 5253413 var2 = 39151 perl -E 'dire $ ENV {var1}/$ ENV {var2}'' – mklement0

+1

@ mklement0 : Ho preso in considerazione l'idea di includerlo, ma l'ho considerato più incentrato sulle tecniche di shell rispetto a Perl. Ma a posteriori penso che sia di questa domanda. Lascerò il tuo commento per rappresentarlo. Grazie – Borodin

+1

Per inciso, il modo più veloce (e più sporco) per farlo è proprio "perl -e" print "$ var1/$ var2 -l' – reinierpost

6

Due modi meno comuni per fare questo fare uso di caratteristiche di lunga standing perl.

La prima è la core module Env, che lega le variabili di ambiente processo perl variabili:

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 

noti che le variabili devono essere presenti nell'ambiente ereditato dal processo Perl, per esempio con export VAR come sopra, o esplicitamente per un singolo comando (come da FOO=hello perl -MEnv -E 'say $FOO').

Il secondo e un po 'più oscuri modo è quello di utilizzare l'uso perl di -s switch per impostare le variabili arbitrarie dalla riga di comando:

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

awk fa qualcosa di simile con il suo -v switch.

+0

Le variabili di ambiente sono anche disponibili tramite l'hash globale '% ENV'; 'shell # export FOO = BAR && perl -E 'dire $ ENV {FOO}'' – Joshua

+0

@Joshua, ovviamente, ma molti hacker e amministratori di perl che hanno bisogno di un solo liner sono solo (ly) [troppo impazienti] (http://c2.com/cgi/wiki?LazinessImpatienceHubris) per digitare '$ ENV {this}' e '$ ENV {that}'. :) – pilcrow

+0

Questa è un'idea davvero carina e quasi vorrei votarla come risposta. Ma, non usare semplicemente le doppie virgolette funziona bene? Per qualche ragione questa risposta è stata cancellata, ma qualcuno ha detto che si potrebbe fare 'perl -e" print $ var1/$ var2 "-l' – Tom

Problemi correlati