Antes de nada, puedes quitar los '\' dentro de los qq(). Así,
qq($asterisk_bin $asterisk_option \"$asterisk_command"\ );que, además, fíjate que has "escapado" las primeras dobles comillas, pero no las segundas
Mejor, lo escribes así:
qq($asterisk_bin $asterisk_option "$asterisk_command");En cuanto al problema, es fácil de entender...
Estás ejecutando un comando. El bucle for() recoge todas las líneas de la ejecución. Pero lo que hay dentro del bucle es un if(), que, ocurra lo que ocurra, terminará (un exit()). Pues bien... el bucle comienza con la PRIMERA línea del comando, que, si lo miras, son las cabeceras de los comandos. Y ahí no está el texto que estás esperando. Por eso falla, y sale por el else{}.
Soluciones...
1.- Ejecutar los comandos pero con alguna opción, si es posible, para que no saquen esos encabezados. Solo el resultado del comando
2.- Leer la salida como un arreglo o vector y deshacernos del primer elemento (la línea de cabeceras)
3.- Si sabemos que la línea de resultados contiene solo un conjunto de palabras, podemos colocar un
next if o meterlo todo dentro de un if() como primera línea del bucle, para descarte cualquier línea que no cumpla con lo que esperamos. Un ejemplo. Si a la hora de pedir un 'sip show registry' sabemos que la columna 'State' solo puede contener los valores de 'Registered' o 'Unregistered', entonces podemos modificar el bucle así (no probado):
Using perl Syntax Highlighting
for ( qx($cmd) ) {
if (/Registered/ or /Unregistered/) {
if (/Registered/) {
print(" El proveedor Gizmo 5 esta registrado. \n");
exit(0);
}
else {
print(" El proveedor Gizmo 5 no esta registrado en este momento. \n");
exit(1);
}
}
}
warn "ERROR en la ejecución del comando\n";
exit(-1);
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
o quizás también, así (no probado)
Using perl Syntax Highlighting
for ( qx($cmd) ) {
next if not /egistered/; # "egistered" es común a las dos palabras
if (/Registered/) {
print(" El proveedor Gizmo 5 esta registrado. \n");
exit(0);
}
else {
print(" El proveedor Gizmo 5 no esta registrado en este momento. \n");
exit(1);
}
}
warn "ERROR en la ejecución del comando\n";
exit(-1);
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Aunque también podemos modificar el else{} y cambiarlo por un if(), si sabemos la segunda palabra que buscamos (no probado):
Using perl Syntax Highlighting
my $return;
for ( qx($cmd) ) {
if (/Registered/) {
print(" El proveedor Gizmo 5 esta registrado. \n");
exit(0);
}
if (/Unregistered/) {
print(" El proveedor Gizmo 5 no esta registrado en este momento. \n");
exit(1);
}
}
warn "ERROR en la ejecución del comando\n";
exit(-1);
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4