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

Perl Prozess starten und Code über STDIN "reinschi



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
mseele
 2005-02-02 12:03
#51490 #51490
User since
2005-02-02
4 Artikel
BenutzerIn
[default_avatar]
Hi,
wie ich weiß kann man in perl auch einen prozess starten und dann den code über STDIN "reinschieben". Unter UNIX ist es wohl so das STRG+D dann das ende markiert(so wars zumindest bei mir) und dann das programm ausgeführt wird. Danach wird der Perl prozess beendent.

Ich würde gerne einen Perl prozess starten, code reinschieben,
ergebniss erhalten, neuer code reinschieben, ergebniss erhalten,
neuer code reinschieben... und das alles in einem prozess(zwecks
preformancegründen).

Hier ein beispiel:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ /usr/bin/perl -c -W -Mstrict -

print "Hello";

- syntax OK

print "Hello";
print hello2

Unquoted string "test" may clash with future reserved word at - line 1.
Name "main::test" used only once: possible typo at - line 1.
- syntax OK

.
.
.


ich schiebe praktisch immer code über stdin rein, er soll gecheckt
werden und dann soll die eingabe wieder frei sein für den nächsten code schnippsel.
geht das? was für ein charackter markiert dafür das ende des code schnippsel?

thx mseele
sesth
 2005-02-02 12:14
#51491 #51491
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Das reinschieben geht auch unter Windows. Die Pipe beendest Du dann mit STRG+Z statt mit STRG+D. Dein Problem benötigt aber einen "Handshake" und dafür sind Pipes nicht so gut geeignet. An Deiner Stelle würde ich einen Prozess mit einem Socket-Server starten und dem dann den Code für den Syntax-Check mit einem Socket-Client rüberschieben. Das Protokoll ist dann entsprechend zu definieren.

Gruß
Thomas
Gruß
Thomas
mseele
 2005-02-02 12:18
#51492 #51492
User since
2005-02-02
4 Artikel
BenutzerIn
[default_avatar]
sorry was meinst du mit "Handshake'?
was bringt es mir wenn ich das ganze über einen Socket-Server/-Client mach?
hab ich da ne möglichkeit ein eof(end-of-file) zu schicken ohne den prozess zu beenden?
wär die dankbar wenn du ein wenig genauer geschreiben könntest was du damit meinst?

vielleicht noch ne wichtige info: das ganze soll später aus java raus erledigt werden. da gibts ne klasse aus der man nen nativen prozess starten und steuern kann. im prinzip das selbe wie wenn es von der console gemacht wird...

thx mseele\n\n

<!--EDIT|mseele|1107340186-->
sesth
 2005-02-02 13:09
#51493 #51493
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Mit "Handshake" meine ich einen geregelten Kommunikationsablauf. Du schickst einen Auftrag und erwartest eine Antwort zu genau diesem Auftrag.

Du solltest Dir auch überlegen, ob z.B. mehr als ein Java-Client gleichzeitig mit dem Syntax-Checker kommunizieren soll. Dann sollte der Perl-Socket-Server für jede Anforderung einen eigenen Thread aufmachen. Solch eine Lösung erfordert aber Kenntnisse im Bereich Mulit-Threading und Socket-Programmierung. Ein technisches Problem mit Java gibt es da nicht.

Aber viellleicht ist es doch besser Deinen ursprünglichen Ansatz zu verfolgen. Dazu muss das aufrufende Programm sich mit stdin/stdout des Sub-Prozesses verbinden und das Perl-Skript arbeitet dann datengesteuert mit einer Eingabeschleife über <STDIN>.

Gruß
Thomas
Gruß
Thomas
mseele
 2005-02-02 14:11
#51494 #51494
User since
2005-02-02
4 Artikel
BenutzerIn
[default_avatar]
sorry, aber ich galube du hast nicht genau verstanden was ich will:
es geht darum nur einen perl-prozess am laufen zu haben weil das startet eines neuen perl-prozesses zeit kostet und dieser syntax-check alle paar sekunden wenn nicht noch öfter durchlaufen muss.
deswegen möchte ich immer nur einen perl prozess laufen haben und ihm wenn nötig code reinschieben, ergebniss lesen und wieder code reinschieben...
das wieder code reinschieben fällt aber weg, weil sich der prozess nach dem ersten mal beendet.
ich will nur wissen ob es einen bestimmten delimiter gibt, der perl sagt das es jetzt den syntax-checker anschmeisen soll und das ergebniss auf STDOUT schreiben soll. danach will ich wieder code reingeben!?

was hat das ganze den mit sockets zu tun? kann ich den perl interpreter auch als server laufen lassen auf den sich dann clients verbinden?\n\n

<!--EDIT|mseele|1107346305-->
Dubu
 2005-02-02 16:03
#51495 #51495
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
In dieser Form wird das nicht gehen. Perl muesste ja den Code kompilieren, dann ausfuehren, und dann wieder mit der Kompilation starten. Vielleicht ginge es ueber die B- oder DB-Klassen, aber damit habe ich mich noch nicht beschaeftigt.

Was jedoch gehen sollte, ist eine Schleife in einem Perl-Programm anzulegen, die von STDIN bis zu einem Keyword liest (_ _END_ _ wuerde sich anbieten; ohne die Leerzeichen, unser Forum mag keine doppelten Unterstriche) und dann den erhaltenen Code durch ein String-eval jagt, also so aehnlich:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;
use warnings;

my $code='';
while (<>) {
   if (/^_ _END_ _$/) {
       if (defined eval $code) {
           print "ok\n";
       } else {
           print "FEHLER!\n";
       }
       $code = '';
   } else {
       $code .= $_;
   }
}

(ungetestet)
mseele
 2005-02-02 16:10
#51496 #51496
User since
2005-02-02
4 Artikel
BenutzerIn
[default_avatar]
das hört sich nicht so schlecht an.
nur brauch ich die genauen fehlermeldungen, das ist ja das was mich interessiert...
betterworld
 2005-02-02 16:24
#51497 #51497
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Das mit dem _ _ END _ _ braucht man nicht... Wenn Du das folgende Programm nimmst, kannst Du jeweils die Eingabe mit Strg-D (oder Strg-Z, je nach Betriebssystem) beenden. Ausserdem gibt er die Fehlermeldung aus, die in $@ steht, wie Du auch mit perldoc -f eval haettest rausfinden koennen.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
while (1){
local $/;
eval <>;
if ($@) {
print "Das war ok!\n";
} else {
print "Das gab einen Fehler:\n$@";
}
<>
}


Edit: Jetzt muesste es funktionieren\n\n

<!--EDIT|betterworld|1107355843-->
sesth
 2005-02-02 17:07
#51498 #51498
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
[quote=mseele,02.02.2005, 13:11]was hat das ganze den mit sockets zu tun? kann ich den perl interpreter auch als server laufen lassen auf den sich dann clients verbinden?[/quote]
Ja, Du kannst ein Perl-Programm als Server laufen lassen. Ein Beispiel findest Du unter Perl Socket Server. Der Client wäre dann in Java zu codieren. Das hat den Vorteil, dass sämtliche Clients den gleichen Server (= Prozeß) verwenden können. In dem Beispiel wird allerdings kein Multithreading verwendet. Ob der Aufwand für Dein Problem angemessen ist, musst Du aber beurteilen.

Gruß
Thomas
Gruß
Thomas
kabel
 2005-02-02 23:42
#51499 #51499
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2005-02-02 12:03.