Rechercher : dans
Par :

Perl STDOUT redirection et retour au défaut.

Dernière réponse le 27 nov 2007 à 18:06:36 Davlar, le 26 nov 2007 à 20:03:57 
 Signaler ce message aux modérateurs

Bonjour,

Actuellement je tente de contrôler le "Output" des print de mon programme perl (5.8).

Je fais plusieurs open et open2 (vers d'autre programmes) je veux que certaines de mes sorties de retour(print ou printf) aillent dans un fichier et certaines autres dans le terminal.

Mais voilà, lorsque je renvoie le STDOUT dans un fichier (STDOUT->fdopen) et que je le ferme le STDOUT ce dernier ne revient jamais à sa valeur de défaut (soit dans le terminal).

Les STDOUT->close, STDOUT->flush, STDOUT->untain et autre ne me permettent jamais de revenir à mon STDOUT de départ.

PS> Je code muti-plateforme donc je peux pas programmes mon retour vers un /dev/pty??


Help .

Dave

Configuration: Windows XP
Firefox 2.0.0.9

Meilleures réponses pour « perl STDOUT redirection et retour au défaut. » dans :
Perl - Entrée et sortie standards Voir Qu'appelle-t-on entrée standard et sortie standard ? Perl permet d'écrire sur la sortie standard, appelée STDOUT et de lire sur l'entrée standard (STDIN). Il s'agit de deux descripteurs fournis par le système d'exploitation et permettant...
Systèmes UNIX - Le shell Voir Introduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire entre le système...
[Bootloader] Dual boot : changer le système démarré par défaut VoirPour changer le système démarré par défaut suivant votre "bootloader" il vous faut : (toutes ces manipulations sont à exécuter en tant que "root") Pour LILO Pour GRUB Pour LILO Éditer votre fichier de configuration...
[IE 7 et 8] Modifier le moteur de recherche par défaut VoirPour Internet Explorer 7 Ouvrez Internet Explorer. Faites un clic sur la flèche dans la barre de recherche en haut à droite. Cliquez sur "Modifier les paramètres de recherche par défaut". Vous pouvez : Définir un moteur de recherche...
Comment récupérer le résultat d'une commande dans une variable VoirComment récupérer le résultat d'une commande dans une variable Préambule Syntaxe Exemples Préambule Il est bien souvent nécessaire de récupérer le résultat d'une commande (ou de son code retour) dans une variable afin de pouvoir...
Perl - Les fichiers VoirLa notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles...
Les variables avec Perl VoirConcept de variable avec Perl Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage Perl peuvent être de trois...
Perl - Caractéristiques du langage VoirFichier source, et interprétation Le fichier source d'un programme écrit en Perl est un simple fichier texte dont l'extension est par convention .pl. Ce fichier source doit être un fichier texte non formatté, c'est-à-dire un fichier texte dans sa...

1

lami20j, le 26 nov 2007 à 21:11:28

Salut,

la fonction select te conviens?

lami20j@debserv:~/trash$ cat ccm.pl
#!/usr/bin/perl
use strict;use warnings;

open FIC,">journal.txt"
     or die "E/S : $!\n";

print "J'écrit sur STDOUT\n";
my $sortie = select(FIC);
print "Hello, j'écrit dans FIC \n";

select($sortie);
print "J'écrit à nouveau sur STDOUT\n";
__END__
l'exécution
lami20j@debserv:~/trash$ perl ccm.pl
J'écrit sur STDOUT
J'écrit à nouveau sur STDOUT
lami20j@debserv:~/trash$ cat journal.txt
Hello, j'écrit dans FIC


lami20j

Répondre à lami20j

2

davlar, le 26 nov 2007 à 22:00:03

Ouin,

Marche pas.

L'idée était bonne mais le problème c'est que ça ne fonctionne pas dans les print devant d'un open ou open2

open (ORA, "| sqlplus $p_connect_string") || die ("Can't pipe to sqlplus: $!");
print ORA "set pagesize 0 linesize 1000 feedback off ver off heading off echo on trimspool on termout on\n";
for ($ix = 0; $ix < $z_numArgs; $ix++)
{
my $z_scr_out = $t_obj_a_compiler[$z_counter];
print ORA "spool pof.txt;\n";
print ORA "@ $z_dossier/$z_scr_out\n";
print ORA "spool off;\n";
}

Comme le print est affecté sur un "FILEHANDLER", le select ne le voit pas. Et quand je tente de le re-rediriger bien effectivement il n'aime pas beaucoup ça -> bad interpreter: Fichier texte occupé.

PS Quand même très intéressant cette commande, je ne la connaissais pas.

Dave

Répondre à davlar

3

lami20j, le 26 nov 2007 à 22:42:20

As-tu essayé de faire

close(ORA);
print "maintenant c'est sur stdout\n";
ou écrire sur STDOUT de cette manière
print STDOUT "j'écris sur stdout\n";
?
lami20j

Répondre à lami20j

4

davlar, le 26 nov 2007 à 23:10:48

Non car le problème n'est pas avant ou après mais dedans mon open ... c'est que ce sont mes print ORA que je veux rediriger l'affichage de retour vers un fichier.

Le select ou la manipulation du STDOUT semblais un bel avenue mais il y'a quelque chose qui ne marche pas et pourtant ce contrôle devrait être possible.

Je peux pas m'imaginer installer Linux et Windows et voir passer tout les lignes de code à mon écran .. Je m'attend à voir plutôt quelque chose du genre : Installation ..... En cours. Et Voir journal pour toute erreur.

A quand la commande noprint :-(

Une autre idée.?

Dave

Répondre à davlar

5

lami20j, le 27 nov 2007 à 09:42:47

Salut,

A quand la commande noprint :-(
Ben, il n'y a pas besoin ;-))
Quand on veut afficher on utilise print et quand on ne veux pas alors on ne l'utilise pas ;-DD

Bon, revenons à ton problème.

J'aimerai bien que tu me dit quand tu veux écrire sur STDOUT et quand tu veux écrire dans ORA, puisque je ne suis pas sûr d'avoir compris ce que tu veux.
lami20j

Répondre à lami20j

6

davlar, le 27 nov 2007 à 17:02:42

Merci de ton aide.

Ok voici un explication avec exemple concrète.

Je reprend en exemple la partie de code suivant:

open (ORA, "| sqlplus $p_connect_string") || die ("Can't pipe to sqlplus: $!");
print ORA "set pagesize 0 linesize 1000 feedback off ver off heading off echo on trimspool on termout on\n";
for ($ix = 0; $ix < $z_numArgs; $ix++)
{
my $z_scr_out = $t_obj_a_compiler[$z_counter];
print ORA "spool pof.txt;\n";
print ORA "@ $z_dossier/$z_scr_out\n";
print ORA "spool off;\n";
}
Close(ORA);

La commande print est utilisé dans le cas présent afin d'envoyer des commande au programme sqlplus à travers le open.
Ces commandes je ne les voies pas à l'affichage et cette partie fonctionne bien.

Le programme sqlplus retourne par contre par lui même du OUTPUT (au terminal). Ce OUTPUT qui vient du programme, je veux le capturer et le renvoyer vers un fichier, c'est pourquoi que je pensais que la commande STDOUT->fdopen(\*OUTPUT, "w"); était un bon choix (Mais je ne peux revenir par la suite à mon terminal (ou à l'état initiale de STDOUT)).


Je veux que le client voit ceci à son écran:
Resultat de la compilation
Module Programme Status
========== ============================================= ========
sql vi_usage_tol.sql OK

Mais pour le moment il reçoit:
Resultat de la compilation
Module Programme Status
========== ============================================= ========

SQL*Plus: Release 10.1.0.5.0 - Production on Lun. Nov. 26 12:00:23 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connecté à :
Oracle Database 10g Release 10.2.0.3.0 - Production
SQL> SQL> SQL> SQL> -- Vue qui regroupe les informations des usages d'imputations
SQL> --
bla bla bla bla bla
SQL> SQL> sql vi_usage_tol.sql OK

Donc Je cherche un moyen de conserver ces messages mais pas les avoir dans mon afficheur.
Bref "trip de pouvoir" je veux tout géré ce qui vient à mon écran et décider ou ça s'en va.


Dave

Répondre à davlar

7

 davlar, le 27 nov 2007 à 18:06:36

J'ai trouvé!!

# Saving STDOUT
open(OLDOUT,">&STDOUT") || die("[$PROGNAME] Couldn't dup STDOUT\n"); # <- Sauvegarder l'origine du STDOUT
# Redirecting STDOUT to file
close(STDOUT); # Fermeture du STDOUT actuel
open(STDOUT,">perl.out"); # Redirection du STDOUT vers un journal (log)
print "CMD: $cmd\n"; # Tous les print ou retour vons dans le journal
# Restore STDOUT
close(STDOUT); # On referme le STDOUT
open(STDOUT,">&OLDOUT"); # On récupère le terminal d'origine (Bref on retourne à l'écran)

Bref avec cela il est possible contrôler à souhait et aussi souvent que l'on veut l'affichage du programme perl.

Référence: http://www.issociate.de/...

Merci pour l'aide.

Dave.

Répondre à davlar
Collection CommentÇaMarche.net