Schrift
[thread]6507[/thread]

Ergebnis eines Programmaufrufs umleiten



<< >> 7 Einträge, 1 Seite
Turtleman
 2004-08-17 15:11
#49345 #49345
User since
2004-08-11
9 Artikel
BenutzerIn
[default_avatar]
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
pq
 2004-08-17 15:28
#49346 #49346
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
hmm...
Code: (dl )
1
2
3
4
5
open PIPE, "$befehl |" or die $!;
while (<PIPE>) {
 print "output: $_";
}
close PIPE or die $?;

oder einfacher (liefert dir den output nach der abarbeitung):
Code: (dl )
1
2
my $output = qx($befehl);
$? == null or die "Fehler: $?";


edit: STDERR vergessen, siehe ptks antwort\n\n

<!--EDIT|pq|1092744235-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
ptk
 2004-08-17 15:35
#49347 #49347
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Normalerweise benutzt man Backtics:
Code: (dl )
my $ausgabe = `command`;


Unter Unix kann man STDERR so umlenken:
Code: (dl )
my $ausgabe = `command 2>&1`;

Allerdings weiss ich nicht, ob 2>&1 unter Windows emuliert wird. Eventuell sagt dir "perldoc perlport" mehr.
Turtleman
 2004-08-17 16:26
#49348 #49348
User since
2004-08-11
9 Artikel
BenutzerIn
[default_avatar]
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
Crian
 2004-08-17 17:17
#49349 #49349
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Code: (dl )
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
ptk
 2004-08-17 19:40
#49350 #49350
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Unter Unix koennen Programme unter Umgehung von STDOUT und STDERR direkt auf das Terminal schreiben:
Code: (dl )
1
2
3
#!/usr/bin/perl
open my $fh, ">/dev/tty" or die $!;
print $fh "Hallo, Welt!\n";

Und dann:
Code: (dl )
1
2
 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?
Turtleman
 2004-08-18 11:54
#49351 #49351
User since
2004-08-11
9 Artikel
BenutzerIn
[default_avatar]
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
<< >> 7 Einträge, 1 Seite



View all threads created 2004-08-17 15:11.