Perl-скрипт для запуска исполняемого файла C с аргументом при стандартном вводе через файл? - PullRequest
0 голосов
/ 05 августа 2009

Я хочу запустить и выполнить ./runnable по аргументу input.afa . Стандартный ввод в этот исполняемый файл осуществляется через файл finalfile . Ранее я пытался сделать то же самое, используя скрипт bash, но, похоже, это не сработало. Поэтому мне было интересно, предоставляет ли Perl такую ​​функциональность. Я знаю, что могу запустить исполняемый файл с его аргументом, используя backticks или системный вызов (). Любые предложения о том, как сделать стандартный ввод через файл.

_ ОБНОВЛЕНИЕ _

Как я уже сказал, я написал сценарий bash для того же. Я не уверен, как это сделать в Perl. Написанный мной сценарий bash:

#!/bin/bash

OUTFILE=outfile
(

while read line
do 

./runnable input.afa
echo $line


done<finalfile

) >$OUTFILE

Данные в стандартном входном файле выглядят следующим образом, где каждая строка соответствует одному временному вводу. Таким образом, если имеется 10 строк, исполняемый файл должен запускаться 10 раз.

__DATA__

2,9,2,9,10,0,38

2,9,2,10,11,0,0

2,9,2,11,12,0,0

2,9,2,12,13,0,0

2,9,2,13,0,1,4

2,9,2,13,3,2,2

2,9,2,12,14,1,2

Ответы [ 2 ]

1 голос
/ 05 августа 2009

Если я правильно понял ваш вопрос, то, возможно, вы ищете что-то вроде этого:

# The command to run.
my $command = "./runnable input.afa";

# $command will be run for each line in $command_stdin
my $command_stdin = "finalfile";

# Open the file pointed to by $command_stdin
open my $inputfh, '<', $command_stdin or die "$command_input: $!";

# For each line
while (my $input = <$inputfh>) {
    chomp($input); # optional, removes line separator

    # Run the command that is pointed to by $command,
    # and open $write_stdin as the write end of the command's
    # stdin.
    open my $write_stdin, '|-', $command or die "$command: $!";

    # Write the arguments to the command's stdin.
    print $write_stdin $input;
}

Подробнее о командах открытия в документации .

0 голосов
/ 05 августа 2009

Код Perl:

$stdout_result = `exescript argument1 argument2 < stdinfile`;

Где stdinfile содержит данные, которые вы хотите передать через stdin.


редактировать

Умный метод - открыть stdinfile, связать его с помощью select с stdin и затем выполнить повторно. Самый простой способ - поместить данные, которые вы хотите передать, во временный файл.

Пример:

open $fh, "<", "datafile" or die($!);
@data = <$fh>; #sucks all the lines in datafile into the array @data
close $fh;

foreach $datum (@data) #foreach singluar datum in the array
{
    #create a temp file
    open $fh, ">", "tempfile" or die($!);
    print $fh $datum;
    close $fh;

    $result = `exe arg1 arg2 arg3 < tempfile`; #run the command. Presumably you'd want to store it somewhere as well...

    #store $result
}

unlink("tempfile"); #remove the tempfile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...