Expect.pm auf stdin/stdout

Expect.pm auf stdin/stdout

am 06.08.2007 13:54:12 von Marc Haber

Hallo,

ich möchte gerne chat(8) im ppp-Einwahlprozess für meine UMTS-Karte
durch ein Perlscript ersetzen. Dazu brauche ich etwas wie Expect.pm -
allerdings muss der vom Script zu führende DIalog auf stdin/stdout
laufen und nicht in einem gespawnten Prozess.

In der Dokumentation für Expect.pm habe ich nicht gefunden, wie man
sowas ausdrückt - geht das mit Expect.pm überhaupt?

Unabhängig von Expect.pm: Gibt es ein anderes Perl-Modul, das mir hier
helfen könnte? Aufgabe ist, in einem Datenstrom von stdin nach
regulären Ausdrücken zu suchen und abhängig von den gefundenen
Ausdrücken mit gewissen Ausgaben auf stdout zu reagieren. Timeouts
(sprich: Wenn n Sekunden nichts kommt, was matched, bitte irgendwie
reagieren) sind ebenfalls Pflicht.

Danke für Eure Hilfe.

Grüße
Marc

--=20
-------------------------------------- !! No courtesy copies, please !! =
-----
Marc Haber | " Questions are the | Mailadresse im =
Header
Mannheim, Germany | Beginning of Wisdom " | =
http://www.zugschlus.de/
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 =
72739834

Re: Expect.pm auf stdin/stdout

am 06.08.2007 17:17:37 von Daniel Fischer

Marc Haber!

> In der Dokumentation für Expect.pm habe ich nicht gefunden, wie man
> sowas ausdrückt - geht das mit Expect.pm überhaupt?

Aus der Dokumentation:

my $exp = Expect->exp_init(\*FILEHANDLE);

Expect muss ja nichts von STDOUT wissen, um Text von STDIN zu
parsen. Ich weiß jetzt auch keinen nicht-dämlichen Weg, Expect
gleichzeitig beide unterzuschieben. Aber im Notfall (wenn du send_slow
etc. brauchst) tut es auch noch ein zweites Expect für STDOUT.


Daniel

Re: Expect.pm auf stdin/stdout

am 07.08.2007 23:30:46 von mlelstv

Daniel Fischer writes:

>my $exp = Expect->exp_init(\*FILEHANDLE);

>Expect muss ja nichts von STDOUT wissen, um Text von STDIN zu
>parsen. Ich weiß jetzt auch keinen nicht-dämlichen Weg, Expect
>gleichzeitig beide unterzuschieben. Aber im Notfall (wenn du send_slow
>etc. brauchst) tut es auch noch ein zweites Expect für STDOUT.

pppd verbindet das chat-script mit dem tty, STDIN und STDOUT
sind dann derselbe Filedescriptor. exp_init(\*STDIN) sollte also
soweit tun.

Alternativ gibt es auch POSIX und termios(5) um timeouts auf
tty-Ebene abzubilden.

Alternativ gibt es select bzw IO::Select um timeouts abzubilden.

--
--
Michael van Elst
Internet: mlelstv@serpens.de
"A potential Snark may lurk in every tree."

Re: Expect.pm auf stdin/stdout

am 13.08.2007 15:20:22 von das-mehdorn

Hallo!

Marc Haber :

> Aufgabe ist, in einem Datenstrom von stdin nach regulären Ausdrücken
> zu suchen und abhängig von den gefundenen Ausdrücken mit gewissen
> Ausgaben auf stdout zu reagieren.

Noch ein Hinweis, da ich schon häufiger deshalb geflucht habe: STDOUT
ist standardmäßig gepuffert, gibt es kein Terminal, sogar blockweise.
Falls du darüber nicht per Expect oder den tty-nahen Methoden aus
perlipc zugreifen[0] willst, solltest du über STDOUT->autoflush(1) bzw.
$|=1 nachdenken -- je nach bevorzugter Schreibweise.

Christoph

[0] Aus denen hat sich letztendlich Expect.pm entwickelt

--
[Letzter Flug der Columbia] Das Ding ist explodiert, in 1000 Stuecke
zerfallen, kaputt. -- Wissen wir, welcher Religion Raumfaehren angehoeren
und was fuer Vorstellungen vom Leben nach der Explosion sie haben?
(nach Jens Link, Martin Bienwald)