Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7032[/thread]

Windows: Pipes & STDIN



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Gast Gast
 2005-06-03 11:55
#55305 #55305
Hallo,
Ich habe folgendes Perl Programm: "print $_ for (<STDIN>)";
Ich rufe es (unter Windows) folgendermaßen auf: "dir | prg.pl"
Leider keine Ausgabe.

Wir erreiche ich den gewünschten Effekt?

Ciao
Zoomby
J-jayz-Z
 2005-06-03 12:04
#55306 #55306
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
<STDIN> ist Standard _Eingabe_. Die willst aber doch die Ausgabe?!
Versuch mal das:
Code: (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl
use strict;
use warnings;

open(PROG, "-| @ARGV");
while(<PROG>) {
print $_;
}
close(PROG);

und dann mit prog.pl dir aufrufen.
Nicht getestet...

EDIT: Oder versuch mal:
Code: (dl )
print $_ for (<STDOUT>);
\n\n

<!--EDIT|J-jayz-Z|1117786476-->
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
ptk
 2005-06-03 12:59
#55307 #55307
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
STDIN ist schon richtig. Scheint ein Windows-spezifisches Problem zu sein (vielleicht wird direkt aud der Konsole oder STDERR geschrieben?). Unter Linux funktioniert es wie erwartet.
Dubu
 2005-06-03 13:32
#55308 #55308
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Bei der oben angegebenen Kommandozeile muss es eigentlich funktionieren. Trotzdem rate ich dazu, das "for" gegen ein "while" einzutauschen:
Code: (dl )
print $_ while (<STDIN>)

oder einfacher
Code: (dl )
print while <STDIN>

oder
Code: (dl )
print while <>


Das "for" wartet naemlich erst, bis die Liste im Argument vollstaendig ist, d.h. bis STDIN geschlossen wurde, waehrend "while" wirklich jede eingehende Zeile sofort ausfuehrt.

Das macht einen Unterschied, wenn der Befehl, der die Daten liefert (hier das "dir"), nicht sofort endet, wie z.B. ein "tail -f" oder aehnliches, und ist ausserdem sparsamer mit dem Speicherplatz.
GwenDragon
 2005-06-03 13:44
#55309 #55309
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Code: (dl )
print $_ for (<STDIN>)
geht schon.
Nur bei Windows wird das Perlskript nicht über den Shebang aufgerufen, deswegen:
dir | perl x.pl\n\n

<!--EDIT|renee|1117793513-->
pKai
 2005-06-03 15:17
#55310 #55310
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Wenn es an der Installation unter Windows liegt, sollte die Methode von Gwendragon (explizite Angabe von perl) auf jeden Fall funktionieren, es sei denn, das Skript selber ist fehlerhaft.

Wenn Perl "richtig" installiert ist sollte der Aufruf über den Skriptnamen (wie im Ursprungs-Post gelistst) funktionieren, sogar ohne das ".pl", wenn .pl unter ENV{PATHEXT} (genauer: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment) als ausführbare Erweiterung eingetragen ist.
Wenn die Installation nicht "sauber" ist, habe ich schon beobachtet, dass Aufrufe des nackten Skriptnamen zwar funktioniern, aber weder ggf. vorhandene Kommandozeilenargumente sehen, noch Daten über STDIN empfangen.

Edit: Der Satz von mir bzgl. "ohne .pl" ist ggf. missverständlich. Daher nochmal erläutert: Die Datei muss schon die Extension pl haben (Da der Win-Kommandozeilenprozessor nicht in die Datei schaut um eine Shebang auszuwerten), sondern immer nach der Extension geht. Die Angabe der Extension ist aber ggf. optional.
Hier wo ich aktuell sitzt lautet der ENV-Eintrag für PATHEXT
Code: (dl )
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PL
was bewirkt, dass alle jene Dateien ohne Angabe der Extension direkt ausführbar sind. Natürlich ist die Reihenfolge der Extension (werden so wie in PATHEXT gelistet probiert) und die Reihenfolge der Locations (., Win-Verz., ENV{PATH}; oder so ähnlich) wo gesucht wird, zu beachten.\n\n

<!--EDIT|pKai|1117804169-->
I sense a soul in search of answers.
GwenDragon
 2005-06-03 15:25
#55311 #55311
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Ja, es sollte auch ohne das perl davor gehen.
Meine Optiperl-Installation hat da mal wieder an der Registry gedreht.
Zoomby
 2005-06-03 18:32
#55312 #55312
User since
2005-06-03
1 Artikel
BenutzerIn
[default_avatar]
Hallo,

Danke für die Antworten.
Wenn ich explizit "dir | perl test.pl" aufrufe funktioniert es tatsächlich. Allerdings hatte ich schon vorher die Endung ".pl" mit dem Perl Interpreter verknüpft. Das heißt wenn ich einfach "test.pl" in der Shell aufrufe funktoniert es. Nur "dir | test.pl" geht eben nicht. Genauer: Das Script wird ausgeführt, bloss die Daten von STDIN kommen nicht an.

Ciao
Zoomy
J-jayz-Z
 2005-06-06 14:55
#55313 #55313
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hmm, ich versteh dann aber nicht ganz, wieso STDIN?
dir gibt doch etwas auf STDOUT aus... Oder?
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
renee
 2005-06-06 15:08
#55314 #55314
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was für dir auf STDOUT geht, ist für Dein Perl Skript STDIN...

Stell's Dir wie eine Röhre vor, auf beiden Seiten ein Stall mit Kamelen. links ein Stall mit 50 Kamelen, rechts der Stall ist leer.

Die Kamele gehen links durch den AUSGANG in die Röhre, laufen durch die Röhre hindurch und gehen beim anderen Stall durch den EINGANG...

Jetzt ersetze Kamele durch Daten, Ausgang durch STDOUT und Eingang durch STDIN, den linken Stall durch "dir" und den rechten Stall durch das Perl-Skript...\n\n

<!--EDIT|renee|1118060905-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-06-03 11:55.