2017-08-30 8 views
0

Je tente d'exécuter un sous-programme spécifique à partir d'une bibliothèque Perl qui imprime une grande quantité de code HTML pendant l'exécution. Après avoir fait quelques recherches, j'ai découvert qu'il est possible d'utiliser la méthode select() pour changer temporairement la sortie print, par exemple, STDERR, en la cachant complètement à l'avant et en la restituant à STDOUT une fois que la bibliothèque a fait son travail.Problème d'utilisation de select() de Perl pour rediriger les impressions vers STDERR, méthode écrasée dans une bibliothèque

Assez simple, mais cela ne marchera pas pour moi. Pour une raison quelconque, quelqu'un a créé une méthode select() dans une bibliothèque critique qui n'a rien à voir avec ce qui précède, mais est une méthode pour interagir avec notre base de données. Par conséquent, chaque fois que j'essaie d'utiliser my $filehandler = select(STDERR);, j'obtiens la méthode de base de données à la place, ce qui entraîne une erreur. Et je ne peux pas commenter cette méthode ou la retirer des méthodes exportées dans cette bibliothèque sans causer trop de problèmes sur d'autres scripts - y compris la bibliothèque que j'essaie de lancer.

Je ne peux même pas utiliser le commentaire de bloc HTML pour en sortir car la bibliothèque imprime également des commentaires. Existe-t-il d'autres alternatives pour exécuter la méthode correcte select()? Ou d'autres alternatives pour empêcher temporairement l'impression du code HTML?

EDIT: Pour référence, ma version Perl est v5.10.1 (*) construit pour Comme déjà mentionné x86_64-linux-thread-multi

+2

Peut-être ... http://perldoc.perl.org/CORE.html – toolic

+0

Ou https://stackoverflow.com/a/3673935/1207195 –

+0

C'est ce qu'on appelle un "gestionnaire de fichiers" (il contient des ressources), Je ne suis pas un gestionnaire de fichiers (il ne gère pas les événements) – ikegami

Répondre

5

dans une comment by toolic, la solution la plus évidente consiste à utiliser CORE::select. L'espace de noms CORE:: vous donne toujours les built-ins.

sub select { 1; } 

sub html { 
    print "<html></html>"; 
} 

open my $string_fh, '>', \my $string or die $!; 
my $stdout = CORE::select $string_fh; 

html(); 

CORE::select $stdout; 
print "hello world"; 

Comme alternative, vous pouvez utiliser Capture::Tiny, ce qui fait vraiment la même chose que sous le capot, mais il semble plus agréable.

use Capture::Tiny 'capture'; 

my ($stdout, undef, undef) = capture { html() }; 

En aparté, cela pourrait être un bon moment pour factoriser cette fonction select et tout le code qui l'utilise, et de dire au collègue combien vous les aimez. En outre, regarder this talk from the Swiss Perl Workshop 2017, ce qui est pertinent pour le sujet.

+0

Me rappelle le temps dont j'avais besoin pour supprimer quelque chose de '% INC' et je me suis rendu compte que nous utilisions' use vars '% INC'' pour quelque chose de hash global qui partageait le produit les détails entre les fichiers .pl ... – simbabque

+0

'CORE :: select' a fonctionné comme un charme pour moi! Je ne pense pas avoir besoin d'importer une bibliothèque pour ça. Maintenant, désolé si cela ressemble à une question idiote, mais où est la sortie de 'html()' va @simbabque? Je pensais que je devais le rediriger vers STDERR, mais ce n'est pas là. Est-ce qu'il est mis au rebut? –

+0

@JorgeFreitas vous pouvez bien sûr le rediriger vers STDOUT, mais vous n'avez pas à le faire. Cela signifierait que cela se retrouverait dans le journal des erreurs de votre serveur Web, et votre administrateur ne l'aimera pas beaucoup. Nous ouvrons un handle pour écrire dans une variable, c'est ce que '\ my $ string' fait. Votre sortie est sur cette variable et vous pouvez même l'utiliser plus tard, ou le changer avant de l'utiliser. – simbabque