Von Perl zu TCL und wieder zurück...

Von Perl zu TCL und wieder zurück...

am 15.02.2007 09:47:49 von Andy1407

Hallo zusammen,


hab so eine super Aufgabe und ein rießen Problem...

Ein Perl-Script liest für mich Werte aus einer Datenbank.
Dann ruft es ein TCL-Script auf und übergibt diese Werte als
Parameter...
Das TCL-Script verarbeitet die Parameter.

UND JETZT
soll das TCL-Script irgendwie einen Rückgabewert an das Perl-Script
geben.
Das Perl-Script soll dann den Rückgabewert auswerten und
weiterverarbeiten...



Hat jemand von euch eine Ahnung wie das geht???
Und evtl. ein Beispiel???


Thx und Greetz
Andy

Re: Von Perl zu TCL und wieder zurück...

am 15.02.2007 09:56:53 von Frank Seitz

Andy1407 wrote:
>
> hab so eine super Aufgabe und ein rießen Problem...
>
> Ein Perl-Script liest für mich Werte aus einer Datenbank.
> Dann ruft es ein TCL-Script auf und übergibt diese Werte als
> Parameter...
> Das TCL-Script verarbeitet die Parameter.
>
> UND JETZT
> soll das TCL-Script irgendwie einen Rückgabewert an das Perl-Script
> geben.

Was für einen Rückgabewert?

> Das Perl-Script soll dann den Rückgabewert auswerten und
> weiterverarbeiten...
>
> Hat jemand von euch eine Ahnung wie das geht???

Mit einer Pipe z.B.

> Und evtl. ein Beispiel???

open(F,'tclscript |')
Dann die Daten z.B. mittels lesen.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Von Perl zu TCL und wieder zurück...

am 15.02.2007 10:36:29 von Mirco Wahab

Andy1407 wrote:
> Ein Perl-Script liest für mich Werte aus einer Datenbank.
> Dann ruft es ein TCL-Script auf und übergibt diese Werte als
> Parameter...
> Das TCL-Script verarbeitet die Parameter.
>
> UND JETZT
> soll das TCL-Script irgendwie einen Rückgabewert an das Perl-Script
> geben.
> Das Perl-Script soll dann den Rückgabewert auswerten und
> weiterverarbeiten...

Was *genau* willst Du und unter welcher Umgebung?

Ich rate mal:

- Perl-Programm (PP) startet TCL-Programm (TP) mit
Kommandozeilenparametern und schreibt in dessen
Standardeingabe Daten rein
- TP läft und liefer Daten auf seiner Standardausgabe
- PP liest die Daten von der Standardausgabe des TP
und verarbeitet sie weiter
- TP weiss, dass es die Standardeingabe lesen muss,
wenn es ein /kanonisches/ '-' (minus) als
letztes Argument erhält,

wenn dem so ist, dann gänge:

my $data = 'CUSTOMER INCOME MONEY $$$ €€€';
my $prog = '/my/tclproc';
my @args = qw'-m ach -s chon --fragnicht -';

my $result = qx{ echo '$data' | $prog @args };

Genau das Thema gab es letztens in comp.lang.perl.misc
(wenn das das ist, was Du möchtest).

Eine andere Variante wäre IPC::open2

...
use IPC::Open2;

my ($chld_out, $chld_in, $childpid);
$childpid = open2($chld_out, $chld_in, $prog, @args)
or die "can't open pipe to $prog: $!";
print $chld_in $data;
close $chld_in;
my $result; { local $/; $result = <$chld_out> };
close $chld_out;
waitpid $childpid, 0;
...
return $result;

Das funktioniert auf der Kommandozeile und
in einer CGI-Umgebung, aber nicht z.B. unter
Apache2/mod_perl.

Ab mod_perl 2.0.3 geht es dann über Apache2::SubProcess so:

my $r = shift(@_); # Apache request object
...
use Config;
use Apache2::SubProcess ();
use constant PERLIO_IS_ENABLED => $Config{useperlio};

my ($in_fh, $out_fh, $err_fh) = $r->spawn_proc_prog($prog, \@args);
print $in_fh $data;
close $in_fh;

if( PERLIO_IS_ENABLED || IO::Select->new($out_fh)->can_read(10) ) {
local $/;
my $result = <$out_fh>;
return $result if defined $result;
}
...


Oder brauchst Du etwas ganz anderes?

Viele Grüße

Mirco

Re: Von Perl zu TCL und wieder zurück...

am 15.02.2007 22:37:16 von Andy1407

Hallo Frank, Hallo Mirco,

danke für eure Hilfe.

Ich hab mich undeutlich ausgedrückt...
Sorry....

Also gut, unter debian läuft wird das perl script mittels cron
gestartet.
Jetzt werden Werte aus einer Datenbank gelesen.
Für jeden Datensatz soll das TCL-Script mit den im Datensatz
vorhandenen Parametern aufgerufen werden.
Das TCL-Script selbst setzt, bzw. führt selbst nur Befehle mittels
expect aus...
Am Ende des TCL Scripts stehen dann in einer Variablen (Array) mehere
Ergebnisse welche während der Laufzeit ermittelt wurden.

Mein Problem ist jetzt:
Ich komme aus der C- und C++ - Welt und da arbeitet man z.B. mit
'return $variable'...
Jetzt wollte ich wissen wie das in Perl und TCL funktioniert...

Den Code von Mirco werde ich morgen testen, glaube so ähnlich sollte
es funktionieren....


Wie gesagt, so gut kenn ich mich mit Perl nicht aus.


Danke euch beiden und eine gute Nacht.


Greetz
Andy

Re: Von Perl zu TCL und wieder zurück...

am 16.02.2007 08:57:43 von Ferry Bolhar

Andy 1407:

> Das TCL-Script selbst setzt, bzw. führt selbst nur Befehle mittels
> expect aus...
> Am Ende des TCL Scripts stehen dann in einer Variablen (Array) mehere
> Ergebnisse welche während der Laufzeit ermittelt wurden.

Das sollte aber mit Perl - und dem Modul "Expect" - genauso gut
gehen. Vielleicht wäre es ein Ansatz, das TCL-Skript auf Perl zu
portieren und mit dem bestehenden Perl-Code zu verbinden? Dann
könnte man sich das ganze Piping sparen, was für die Performance
wohl auch nicht das Schlechteste wäre...

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at