Schrift
[thread]5977[/thread]

Programm soll die eigene Ausgabe lesen



<< >> 6 Einträge, 1 Seite
ronald
 2003-12-19 11:07
#76598 #76598
User since
2003-08-15
76 Artikel
BenutzerIn
[default_avatar]
Irgendwo habe ich mal gelesen, dass ein Programm seine eigene Bildschirm-Ausgabe wieder einlesen kann.

Folgendes Problem:
Ich habe ein Modul, das etwas auf den Bildschirm schreibt.

in dem Testprogramm für das Modul steuere ich über einen Parameter (bzw. über eine Methode) dass die Ausgabe nicht auf den Bildschirm kommt sondern als Rückgabewert.
Aber je mehr das Modul wächst desto umständlicher wird es.
Mittlerweile sind so viele Tricks drin, dass ich das Orignalverhalten kaum noch testen kann.

Am saubersten wäre es, wenn das Modul seine Daten ganz normal auf den Bildschirm schreibt - und das Testprogramm sie von dort wieder einliest.

Irgendwo habe ich mal gelesen, wie das geht.
Aber weder im Cookbook noch im AdvancedPerlProgramming kann ich es finden. Entweder bin ich blind, müde oder es steht wo anders.

Wer kann helfen?
pq
 2003-12-19 12:12
#76599 #76599
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
http://groups.google.de/groups?....num%3D8
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
Relais
 2003-12-19 12:21
#76600 #76600
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Vorschlag:

Laß Dein Modul sämtliche Bildschirmausgaben über eine besondere Routine
durchführen. Zum Beispiel:


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$self->quaek( @auszugebendes ); # so die Ausgaben

sub quaek {
shift;
print @_;
# return @_;
}

# oder ohne OO:

quaek( @auszugebendes ); # so die Ausgaben

sub quaek {
print @_;
# return @_;
}


Nun brauchst Du nur noch die quaek-Routine zu ändern (oder bei OO könntest Du sie auch in einer abgeleiteten Klasse überschreiben).

Von der Ausgabe zu lesen ist so nicht nötig.
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
pq
 2003-12-19 12:37
#76601 #76601
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
da find ich das mit dem tie() aber eleganter... =)
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
Crian
 2003-12-19 13:00
#76602 #76602
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Einlesen der Ausgabe?

Code: (dl )
programm1|programm2


Wenn Du die Ausgaben des eigenen Programms weiterverwenden willst, musst Du Dir die irgendwie merken (zusätzlich in einen Array schreiben beim Ausgeben?).\n\n

<!--EDIT|Crian|1071831690-->
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
ronald
 2003-12-19 14:55
#76603 #76603
User since
2003-08-15
76 Artikel
BenutzerIn
[default_avatar]
Hat sich erledigt.
Es war doch im Cookbook:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Filtering Your Own Output
Problem
You want to postprocess your program's output without writing a separate program to do so.

Solution
Use the forking form of open to attach a filter to yourself. For example, this will restrict your program to a hundred lines of output:

head(100);
while (<>) {
   print;
}

sub head {
   my $lines = shift || 20;
   return if $pid = open(STDOUT, "|-");
   die "cannot fork: $!" unless defined $pid;
   while (<STDIN>) {
       print;
       last unless --$lines;
   }
   exit;
}


Das ist für mein Testprogramm aber nicht brauchbar, weil der geforkte Prozess die ganze Rückgabe nimmt.

Ich habe mich dann doch für den Ansatz von @Relais entschieden (der funktioniert und ist handhabbar).
Vielen Dank an dieser Stelle.

Ronald
<< >> 6 Einträge, 1 Seite



View all threads created 2003-12-19 11:07.