Thread Ausführen externer Kommandos mit Backticks: Fragst du da Fehler ab? (17 answers)
Opened by Strat at 2004-06-08 02:26

betterworld
 2007-03-26 18:04
#83184 #83184
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=renee,21.03.2007, 19:56]Welcher Archäologe hat sich denn hier zu Perl-Community.de verirrt. Der Thread ist ja schon uralt :p[/quote]
Offenbar habe ich auch schon abgestimmt, obwohl ich mich nicht mehr an die Umfrage erinnern kann :)

Aber zum Thema: Backticks sind wirklich grausam.  Was sie nicht haben, ist eine Mehrere-Argumente-Form wie bei system("program", @args).  Daher muss man immer alles Quoten.  Aus diesem Grunde bevorzuge ich open.  Wer nicht jedes Mal den ganzen Kram schreiben will, kann so eine Subroutine verwenden:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sub SafeBackticks {
       my ($cmd, @args) = @_;
       open (my $pipe, '-|', $cmd, @args)
               or die "Could not run $cmd @args: $!\n";

       my $output = do {local $/; <$pipe>};
       defined ($output) or die "read: $!";

       unless ( close($pipe) ) {
               my $error = ($? & 0x7f)
                       ? 'Signal ' . ($? & 0x7f)
                       : 'Exit status ' . ($? >> 8);

               die "$error: $cmd @args";
       }
       return $output;
}

Zum Aufruf dieser Sub muss ich wohl nichts sagen, das ist mehr oder weniger intuitiv.  Zurueckgegeben wird die Ausgabe des Programms (als String, ungesplittet).  Im Fehlerfall wird eine Exception generiert, die man nach Belieben mit eval{} abfangen kann.\n\n

<!--EDIT|betterworld|1174917916-->

View full thread Ausführen externer Kommandos mit Backticks: Fragst du da Fehler ab?