User since
2003-08-15
76
Artikel
BenutzerIn
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?
User since
2003-08-06
2246
Artikel
ModeratorIn
Vorschlag:
Laß Dein Modul sämtliche Bildschirmausgaben über eine besondere Routine
durchführen. Zum Beispiel:
$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.
User since
2003-08-04
12208
Artikel
Admin1
da find ich das mit dem tie() aber eleganter... =)
User since
2003-08-04
5870
Artikel
ModeratorIn
Einlesen der Ausgabe?
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
User since
2003-08-15
76
Artikel
BenutzerIn
Hat sich erledigt.
Es war doch im Cookbook:
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