Thread system() in Perl mit multiplen Argumenten (15 answers)
Opened by LordK at 2016-07-03 14:59

Linuxer
 2016-09-05 19:04
#185336 #185336
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Wie von einigen bereits angemerkt, funktioniert das nicht so wie gewünscht.

Bei my @mafft = ("mafft", "--auto", "--phylipout", "--reorder", "$file.fasta > infile"); wird das letzte Argument, das die Ausgabeumleitung für die Shell enthält, als ein Argument an das Kommando "mafft" geliefert. Aufgrund der Argumentliste wird keine Shell gestartet, die die Ausgabeumleitung umsetzen könnte.



Als Alternative zu den genannten Ansätzen:

Wenn das Programm nur mit Kommandozeilenargumenten aufgerufen werden muss, könnte man die Ausgabeumleitung in Perl umsetzen. Man öffnet die Ausgabedatei schreibend, und das Kommando öffnet man über eine lesende Pipe.
Dann liest man zeilenweise aus der Pipe und schreibt direkt wieder ins Handle der Ausgabedatei:

Schema (ungetestet):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my $outfile = 'infile';

my @cmd = ("mafft", "--auto", "--phylipout", "--reorder", "$file.fasta" );

open my $out_fh, '>', $outfile 
  or die "open($outfile, w) failed: $!";

open( my $pipe, '-|', @cmd ) 
  or die sprintf "Could not open pipe from '%s': $!", join( ' ', @cmd);

while ( my $line =<$pipe> ) {
  print $out_fh $line
    or die "Write to '$outfile' failed: $!";
}

close $pipe;

close $out_fh or die "close($outfile) failed: $!";


edit:
Oder man schaut sich CPAN:IPC::Run3 an.
Last edited: 2016-09-05 19:06:17 +0200 (CEST)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread system() in Perl mit multiplen Argumenten