User since
2004-08-11
9
Artikel
BenutzerIn
Hallo Zusammen,
schon wieder stößt mein Perl-Wissen an seine Grenzen.
Ich versuche folgendes:
mit dem Befehl system wird über Kommandozeile (DOS, Win2000) ein Programm aufgerufen. Dieses Programm liefert mir eine Rückgabe auf der Kommandozeile. In dieser Rückgabe sind Daten enthalten, mit denen ich dann weiterarbeiten muss.
Bis jetzt habe ich dies so realisiert (mit Umweg über eine Datei):
open (STDOUT, ">$dateiname") or die $!;
open (STDERR, ">$dateiname") or die $!;
system $befehl; #String in dem der Programmaufruf steckt
Somit sehe ich natürlich nichts mehr in der Kommandozeile, weil dann ja alles in die Datei geschrieben wird. Aus dieser lese ich dann aus und habe meine Daten.
Das finde ich aber nicht sehr elegant, darum meine Frage:
gibt es eine Möglichkeit nur das Ergebnis des system Aufrufes irgendwie zu speichern (in Datei, String, Array). Habe schon einiges rumprobiert, habe aber nix passendes gefunden.
Wenn mir jemand helfen könnte wäre ich sehr dankbar.
Gruß
Christian
User since
2003-08-04
12208
Artikel
Admin1
hmm...
open PIPE, "$befehl |" or die $!;
while (<PIPE>) {
print "output: $_";
}
close PIPE or die $?;
oder einfacher (liefert dir den output nach der abarbeitung):
my $output = qx($befehl);
$? == null or die "Fehler: $?";
edit: STDERR vergessen, siehe ptks antwort\n\n
<!--EDIT|pq|1092744235-->
User since
2003-11-28
3645
Artikel
ModeratorIn
Normalerweise benutzt man Backtics:
Unter Unix kann man STDERR so umlenken:
my $ausgabe = `command 2>&1`;
Allerdings weiss ich nicht, ob 2>&1 unter Windows emuliert wird. Eventuell sagt dir "perldoc perlport" mehr.
User since
2004-08-11
9
Artikel
BenutzerIn
Hallo pq,
die Sache mit qx($befehl); klingt sehr interessant, es wird auch alles so ausgeführt wie es soll, dummerweise wird in die Variable $output gar nichts geschrieben. Das Programm wird aber ausgeführt.
Habe sowas schon mal unter Cygwin (Bash-Shell) gemacht. Da ging das umpipen dieses Kommandos (mit anderen Parametern) spielend. Nur hier mit Perl will es einfach nicht gelingen. Vielleicht stell ich mich aber auch zu blöd an.
Wenn mir also noch jemand einen Tip hätte wärs echt prima.
Gruß
Christian
User since
2003-08-04
5872
Artikel
ModeratorIn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-2000 Microsoft Corp.
G:\privat\perl\forum>output.pl
Ich habe folgenden output erhalten:
Datenträger in Laufwerk G: ist USB-STICK
Datenträgernummer: BCD0-06D0
Verzeichnis von G:\privat\perl\forum
04.08.2004 13:11 <DIR> .
04.08.2004 13:11 <DIR> ..
04.08.2004 13:14 1.302 peggy.pl
17.08.2004 15:17 143 output.pl
17.08.2004 15:01 200 testdatei.txt
17.08.2004 15:12 256 datei_zeilen_weg.pl
4 Datei(en) 1.901 Bytes
2 Verzeichnis(se), 33.234.944 Bytes frei
-----------------------------------------------------------------
G:\privat\perl\forum>cat output.pl
#!/usr/bin/perl
use strict;
use warnings;
my $output = qx(dir);
print "Ich habe folgenden output erhalten:\n", $output, "-"x65, "\n";
G:\privat\perl\forum>
Wie man sieht, funktioniert
my $output = qx(dir); auch unter Windows.
Edit: Für ein echtes Programm siehe Fehlerbehandlung bei pq.\n\n
<!--EDIT|Crian|1092748796-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;
use strict; use warnings; Link zu meiner Perlseite
User since
2003-11-28
3645
Artikel
ModeratorIn
Unter Unix koennen Programme unter Umgehung von STDOUT und STDERR direkt auf das Terminal schreiben:
#!/usr/bin/perl
open my $fh, ">/dev/tty" or die $!;
print $fh "Hallo, Welt!\n";
Und dann:
perl test.pl >&/tmp/bla
Hallo, Welt!
(>& ist eine csh-Spezialität zum Umlenken von STDOUT und STDERR).
Vielleicht passiert sowas aehnliches bei dir auch?
User since
2004-08-11
9
Artikel
BenutzerIn
Hallo Zusammen,
vielen Dank für die Hilfe. Habe es jetzt endlich hinbekommen. Nachdem ich in meinem Befehlsstring die Hochkommas durch qq| ersetzt hatte. Ausserdem waren in meinem Befehlsstring auch noch einige Zeichen enthalten die der Umleitung gar nicht geschmeckt haben. Aber ein paar Chomp's später haut auch das eindlich hin.
Nochmals Dankeschön an alle die mir geholfen haben.
Gruß
Christian