Perl script para executar um executável C com um argumento dando entrada padrão através de um arquivo?

StackOverflow https://stackoverflow.com/questions/1234287

  •  22-07-2019
  •  | 
  •  

Pergunta

Eu quero correr e ./runnable executável no argumento input.afa . A entrada padrão para este executável é através de um arquivo finalfile . Eu estava anteriormente tentando fazer o mesmo usando um script, mas que não parecem funcionar. Então eu queria saber se Perl fornece essa funcionalidade. Eu sei que posso executar o executável com seu argumento usando backticks ou sistema (chamada). Todas as sugestões sobre como dar entrada padrão através de arquivo.

_ Atualização _

Como eu disse que eu tinha escrito um script para o mesmo. Eu não sei como proceder para fazê-lo em Perl. O script bash que eu escrevi foi:

#!/bin/bash

OUTFILE=outfile
(

while read line
do 

./runnable input.afa
echo $line


done<finalfile

) >$OUTFILE

Os dados no ficheiro de entrada padrão é como se segue, onde cada linha correspondem a uma entrada de tempo. Então, se existem 10 linhas, em seguida, o executável deve ser executado 10 vezes.

__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
Foi útil?

Solução

código Perl:

$stdout_result = `exescript argument1 argument2 < stdinfile`;

Onde stdinfile contém os dados que você quer ser passada através de stdin.


editar

O método inteligente seria stdinfile aberta, amarrá-lo via seleção para stdin, e em seguida, executar repetidamente. O método mais fácil seria colocar os dados que você deseja passar através de um arquivo temporário.

Exemplo:

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

Outras dicas

Se eu entendi sua pergunta corretamente, então você está, talvez, procurando algo parecido com isto:

# 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;
}

Mais informações sobre os comandos de abertura na documentação .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top