Le script Perl pour exécuter un exécutable C avec un argument tout en donnant une entrée standard via un fichier?

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

  •  22-07-2019
  •  | 
  •  

Question

Je souhaite exécuter et exécuter ./ runnable sur l'argument input.afa . L’entrée standard de cet exécutable se fait via un fichier finalfile . J'essayais plus tôt de faire la même chose en utilisant un script bash, mais cela ne semble pas fonctionner. Je me demandais donc si Perl fournissait une telle fonctionnalité. Je sais que je peux exécuter l'exécutable avec son argument en utilisant des backticks ou un appel system (). Toutes les suggestions sur la façon de donner une entrée standard par fichier.

_ UPDATE _

Comme je l'ai dit, j'avais écrit un script bash pour le même. Je ne sais pas comment faire pour le faire en Perl. Le script bash que j'ai écrit était:

#!/bin/bash

OUTFILE=outfile
(

while read line
do 

./runnable input.afa
echo $line


done<finalfile

) >$OUTFILE

Les données du fichier d’entrée standard sont les suivantes: chaque ligne correspond à une entrée unique. Donc, s’il ya 10 lignes, l’exécutable doit être exécuté 10 fois.

__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
Était-ce utile?

La solution

Code Perl:

$stdout_result = `exescript argument1 argument2 < stdinfile`;

Où stdinfile contient les données que vous voulez transmettre via stdin.

modifier

La méthode la plus intelligente serait d’ouvrir stdinfile, de le lier avec select à stdin, puis d’exécuter plusieurs fois. La méthode la plus simple consiste à placer les données que vous souhaitez transmettre dans un fichier temporaire.

Exemple:

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

Autres conseils

Si j'ai bien compris votre question, vous cherchez peut-être quelque chose comme ceci:

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

Plus d'informations sur l'ouverture de commandes dans la documentation .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top