Я пытаюсь закодировать 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 для сравнения.
Вы можете использовать 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
.