2012-07-01 2 views
0

Я написал три небольших программы в perl. У меня есть Program1.pl, затем Program2.pl (который использует вывод, сгенерированный Program1.pl в качестве ввода), а затем у меня есть Program3.pl (который использует вывод, сгенерированный Program2.pl в качестве входных данных).Как объединить три небольшие программы perl как один?

Теперь я хочу написать программу, которая «вызывает» все три программы, так что пользователю нужно запустить только одну программу, а именно MainProgram.pl.

Как мне это сделать?

Заранее благодарен! :)

+1

Не зная реального кода, на него явно трудно ответить. – Lion

+0

Вы можете поместить три вызова в сценарий оболочки или пакетный файл (в Windows). – simbabque

+2

С точки зрения дизайна, есть ли причина, по которой вы фактически не объединяете эти программы в одну реальную программу или, возможно, не конвертируете программы в модули и не запускаете их из одного сценария? Это был бы обычный способ «комбинирования», если у вас нет причин не делать этого. –

ответ

3

Я зависит от того, что вы имеете в виду объединить, но если вы можете сделать это, например, при создании трубы:

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

Я действительно не знаю, правильно ли слово «комбинировать», но я хочу запустить все три программы, просто запустив одну программу. Это имеет смысл ...? – WannabePerlExpert

+1

да, конечно. Но вы должны быть готовы работать в трубе. Вы не можете комбинировать любые программы, которые вы хотите. Вы говорите: «который использует вывод, сгенерированный Program1.pl в качестве входных данных». Это звучит как хорошая задача для трубы. Но если бы вы могли привести несколько примеров, было бы проще помочь вам –

+0

Хорошо, я попытаюсь объяснить это примерами: Program1 принимает входные данные из двух столбца txt-файла. Файл помещается в хэш, с ключами как column1 и значениями как column2. Затем другой txt-файл считывается в другой хеш - тот же формат, что и первый. Теперь, если в хэшах есть соответствующие записи, они записываются в Output1.txt. Если совпадений не найдено, ключи и значения записываются в Output2.txt, разделенные вкладкой. – WannabePerlExpert

0

Похоже, что есть небольшая проблема дизайна здесь ; было бы целесообразно передавать данные с суб-суб или использовать структуру OO, а не переводить один сценарий в другой, а затем в другой.

0

Если «Output [n]» файлы не нужны человеку, вы просто нужно подтолкнуть результаты в массивы, а затем прочитать массивы в хэши на последующих шагах. Это работает только в случаях, когда количество элементов будет вписываться в память. Если вы обрабатываете гигабайты данных, вам могут понадобиться файлы-посредники.

push - оператор массива.

Трубы не могут быть легко использованы, поскольку на выходе имеется более одного выхода и более одного условия.

0

В зависимости от того, сколько вы хотите, чтобы изменить код это может быть очень простым, как:

#!/usr/bin/perl 

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

Или вы могли бы переписать ваши скрипты в один скрипт с подпрограммами для каждой части вы хотите выполнить. Что-то вроде:

#!/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 
} 

Но если честно, это звучит, как вам просто нужно написать новый сценарий, который делает всю логику вам нужно, и просто мерзавец избавиться от других сценариев. Было бы проще не писать все эти «временные» файлы, чтобы просто читать их снова, чтобы продолжить обработку. Вы можете передавать хеши и массивы в подпрограммы и возвращать хэши или массивы, или просто изменять их, которые вы передали (если вы передаете ссылки).

О, и упоминание о использовании труб-труб полезно только при стандартном и/или стандартном погрешности одной программы и отправке этого стандарта в другую программу. И так как вы сказали, что ваши сценарии пишут в файлы и читаются из файлов, тогда они не печатаются до стандартного и не читают со стандартного. Таким образом, объединение их вместе не принесет вам ничего больше, чем просто вызвать каждого из них последовательно. Вы могли бы просто выполнить их так, как это делается (из bash shell):

$ Program1.pl && Program2.pl && Program3.pl 
Смежные вопросы