Выполните программу на C ++ и скопируйте вывод cmd, используя Perl

0

Я пытаюсь закодировать Perl-скрипт, который будет компилировать программу C++, а затем выполнить ее, передав требуемые значения. После выполнения, мне нужно что-то напечатанное на cmd для сравнения с образцом кода.

Прямо сейчас мой код компилирует код cpp отлично и правильно выполняет его, но заканчивается без передачи значений. Все, что я делаю сейчас, это использовать системные команды

system("cl E:\\checker\\Perl\\temp.cpp");
system("temp.exe");
system("10");
system("20");
system("30");
system("40");
system("50");

Код C++ - это что-то вроде этого

cin >> a;
cin >> b;
cin >> c;
cin >> d;
cin >> e;

Код правильно компилируется и вызывается, но следующие значения (которые являются входами в код C++, который использует cin), похоже, не работают

Обратите внимание, что я использую компилятор Visual Studio. Также может кто-то сказать мне, как я могу извлечь информацию, выводимую кодом C++, в, возможно, массив perl для сравнения.

Теги:
visual-studio-2012

1 ответ

2
Лучший ответ

Вы можете использовать IPC::Open2 для установления двунаправленной связи между вашим скриптом Perl и другой программой, например

use IPC::Open2;
use autodie;
my ($chld_out, $chld_in);
my $pid = open2(
    $chld_out, 
    $chld_in, 
    q(bc -lq)
);
$chld_in->print("1+1\n");
my $answer = <$chld_out>;
print $answer;
kill 'SIGINT', $pid; # I don't believe waitpid() works on Win32. Possibly with Cygwin.

К сожалению, буферизация может сделать этот подход намного сложнее, чем можно было бы надеяться. Вам также придется вручную подождать и пожинать дочерний процесс. Альтернативой может быть использование модуля, такого как IO::Pty или Expect для создания псевдо-tty-среды для имитации взаимодействия с пользователем (но я считаю, что эти две работы работают только в среде Cygwin в Windows). Там также IPC::Run, более полнофункциональная альтернатива IPC::Open2/3.

См. Также: perlipc и perlfaq8.


Правильный синтаксис для system - либо

system('command', 'arg1', 'arg2', ... , 'argn');

Или все как одна строка, которая допускает интерпретацию оболочки (что вам может и не нужно):

system('command arg1 arg2');

system не выводит результат. Вместо этого используйте оператор backticks:

my $command_output = 'command args';

или его общей формы qx. (Если вы назначаете массив, вывод будет разбит на $/ и будет помещен в массив по одной строке за раз).

Существует также форма открытой формы (open my $pipeh, '-|', 'command', 'arg1',..., 'argn') or die $!;) и функцию readpipe.

  • 0
    Я попробовал обратные пометки, проблема в том, что числа снова теряются, и программа C ++ ожидает, что я снова введу ввод. Обратите внимание, что это не аргументы кода C ++, а входные данные, которые должен вводить пользователь.
  • 0
    @chettyharish Я неверно истолковал твой вопрос. Редактировать подходит.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню