¿Cómo combinar tres pequeños programas perl como uno solo?

Escribí tres pequeños programas en perl. Tengo Program1.pl, luego Program2.pl (que usa la salida generada por Program1.pl como entrada) y luego tengo Program3.pl (que usa la salida generada por Program2.pl como entrada).

Ahora quiero escribir un programa que 'llame' a los tres programas, de modo que el usuario solo tenga que ejecutar un programa, a saber, MainProgram.pl.

¿Cómo voy a hacer esto?

Gracias de antemano! :)

preguntado el 01 de julio de 12 a las 16:07

Sin conocer el código real, obviamente es difícil de responder. -

Puede colocar las tres llamadas en un script de shell o en un archivo por lotes (en Windows). -

Desde una perspectiva de diseño, ¿hay alguna razón por la que en realidad no combine estos programas en un programa real o tal vez convierta los programas en módulos y los ejecute desde un único script? Esta sería la forma normal de "combinar", a menos que tenga una razón para no hacerlo. -

4 Respuestas

Depende de lo que quieras decir con combinar, pero si puede hacer esto, por ejemplo, creando una tubería:

open(PIPE, "perl Program1.pl | perl Program2.pl | perl Prograp3.pl |") or die "can't create pipe: $!";
while(<PIPE>){
  print;
}

Respondido 01 Jul 12, 16:07

Realmente no sé si 'combinar' es la palabra correcta, pero quiero ejecutar los tres programas ejecutando solo un programa... ¿Tiene eso algún sentido...? - WannabePerlExperto

sí, claro. Pero sus programas deben estar listos para trabajar en una tubería. No puede simplemente combinar los programas que desee. Usted dice "que usa la salida generada por Program1.pl como entrada". Eso suena como una buena tarea para una pipa. Pero si pudiera proporcionar algunos ejemplos, sería más fácil ayudarlo: Igor Chubin

Ok, voy a tratar de explicarlo con ejemplos: Program1 toma datos de un archivo txt de dos columnas. El archivo se coloca en un hash, con claves como columna1 y valores como columna2. Luego, otro archivo txt se lee en otro hash, el mismo formato que el primero. Ahora, si hay entradas correspondientes en los valores hash, se escriben en Output1.txt. Si no se encuentran coincidencias, las claves y los valores se escriben en Output2.txt, separados por una tabulación. - WannabePerlExperto

Program2 toma Output2.txt como entrada, nuevamente lee en un hash como las dos veces anteriores. A continuación, se comparan las claves y los valores. Si son 100 % idénticos, se escriben en Output3.txt. De lo contrario, las claves y los valores se escriben en Output4.txt, separados por una tabulación. Program3 toma Output4.txt como entrada. El archivo de entrada se lee en una matriz. Un bucle for pasa por la matriz y hace coincidir cada elemento con varias expresiones regulares. Si se encuentra una coincidencia, el elemento de la matriz se escribe en Output5.txt y si no se encuentra una coincidencia, el elemento de la matriz se escribe en Output6.txt. Espero que esto tenga más sentido. - WannabePerlExperto

Creo que puedes usar tuberías en este escenario: Igor Chubin

Parece que hay un pequeño problema de diseño aquí; tendría sentido pasar datos de sub a sub, o usar una estructura OO, en lugar de canalizar un script a otro y luego a otro

Respondido 01 Jul 12, 16:07

A menos que un ser humano necesite los archivos "Salida [n]", simplemente necesita insertar sus resultados en matrices, luego leer las matrices en hashes en los pasos posteriores. Esto solo funciona para casos en los que la cantidad de elementos cabe en la memoria. Si está procesando gigabytes de datos, es posible que necesite los archivos intermedios.

push es un operador de matriz.

Las tuberías no se pueden usar fácilmente porque tiene más de una salida y más de una condición en la salida.

Respondido 02 Jul 12, 18:07

Dependiendo de cuánto desee cambiar su código, podría ser muy simple, como:

#!/usr/bin/perl

system('perl Program1.pl');
system('perl Program2.pl');
system('perl Program3.pl');

O puede reescribir sus scripts en un único script con subrutinas para cada parte que desee ejecutar. Algo como:

#!/usr/bin/perl

part_A();
part_B();
part_C();
exit;

sub part_A {
    # code from Program1.pl goes in here
}

sub part_B {
    # code from Program2.pl goes here
}

sub part_C {
    # code from Program3.pl here
}

Pero, sinceramente, parece que solo necesita escribir un nuevo script que tenga toda la lógica que necesita y simplemente deshacerse de los otros scripts. Sería más sencillo no escribir todos esos archivos "temporales" solo para leerlos nuevamente y continuar con el procesamiento. Puede pasar hashes y arreglos a subrutinas y hacer que devuelvan hashes o arreglos, o simplemente hacer que modifiquen los que pasó (si pasa referencias).

Ah, y la mención del uso de tuberías: las tuberías solo son útiles cuando se saca el estándar y/o el error estándar de un programa y se envía a otro programa. Y dado que dijo que sus scripts escriben en archivos y leen de archivos, entonces no se imprimen de forma estándar ni se leen desde la entrada estándar. Por lo tanto, unirlos no lo beneficiará más que simplemente llamar a cada uno en secuencia. También podría ejecutarlos en línea de esta manera (desde bash shell):

$ Program1.pl && Program2.pl && Program3.pl

Respondido 02 Jul 12, 19:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.