2012-05-08 10 views
5

Estoy evaluando si ciertas variables coinciden o no con los valores esperados. Las variables se configuran en la memoria por un determinado programa, cuyos valores se pueden acceder desde el shell con un programa personalizado.Perl one-liner si no lógica

Estoy canalizando la salida del comando shell para awk obtener el campo específico que quiero y luego quiero ejecutarlo a través de perl para ver si coincide con el valor esperado. Por ejemplo,

ysgrp autostart | awk -F\: '{print $1}' | perl -e 'print {"True"} else {print "False"} if /on/' 

Sin embargo, estoy recibiendo quejas de Perl sobre compilación errores cerca de "} else". ¿Cómo maneja uno la lógica if/then/else en un perl one-liner?

Respuesta

12

No se puede utilizar una condición else en un sufijo condicional. También se puede usar un operador condicional ternario así:

perl -e 'print /on/ ? "True" : "False"' 

O utilizar bloques explícitos como esto:

perl -e 'if (/on/) { print "True" } else { print "False" }' 
1

Uno no lo hace, excepto mediante el operador ternario ?:; la sintaxis foo if bar no es compatible con else.

+1

Creo que significa ** ** ternaria operador; o) – phuzi

+0

Yeh, tratando de hacer demasiadas cosas a la vez – geekosaur

+0

no sé de muchos lenguajes de programación que tienen múltiples operadores ternarios; la sintaxis es demasiado molesta para analizar. – geekosaur

1

Se podría hacer:

... | perl -ne 'print /on/ ? "True" : "False"' 

pero por favor no lo haga! Usted sería mejor hacer:

... | grep -qF on && echo True || echo False 
+0

Esta respuesta es mejor debido a la adición de la bandera "n". Sin él, la coincidencia no funcionará como se esperaba. –

3

Esta parte:

awk -F\: '{print $1}' | perl -e 'print {"True"} else {print "False"} if /on/' 

se pueden manejar en Perl (si recuerda awk correctamente):

perl -F/:/ -lane 'print $F[0] =~ /on/ ? "True" : "False"' 

Tenga en cuenta el uso del interruptor -n, sin el cual su perl one-liner no funcionará. También tenga en cuenta el interruptor -l, que agrega una nueva línea a su impresión, que es algo que supongo que desea. De lo contrario su salida será algo como:

TrueTrueTrueFalseTrueFalse 
+0

'-F:' sería suficiente. – ikegami

+0

Me doy cuenta de que el OP no terminó con una nueva línea, pero eso no es realmente kosher. Yo usaría 'perl -F: -lane '...'' – ikegami

+0

@ikegami 1: Es cierto, 2: Lo sé, simplemente lo solucioné. – TLP

Cuestiones relacionadas