10
votes

Comment puis-je imprimer une variable au lieu d'un fichier, à Perl?

Comment puis-je imprimer à une variable avec Perl?

Je travaille sur un programme pendant un certain temps, ce qui enregistre son progrès itératif strong> de manière très verbeuse ... P > XXX PRE>

Cependant, j'aimerais également imprimer de manière aussi sélective certains des messages dans un fichier différent. Naturellement, je pourrais sécher le code avec ... p> xxx pré>

ou réécrire toute l'entreprise dans une fonction. Bla. P>

Ce que je veux faire est de faire de la magie lorsque j'ouvre le $ Connecthandle de sorte que lorsque je suis imprimer code> 'ing, je fais en fait un Sprintf code> Opération ISH contre une variable (appelez-le $ actuel_itération code>), de sorte que lorsque je passe à un point de décision, je peux faire quelque chose comme ça ... P>

print $real_log_file $current_iteration;
print $other_real_log_file $current_iteration if($condition);


3 commentaires

Déjà vu? Stackoverflow.com/questions/1532544/...


Peut-être. Je n'essaie pas de tenter les ruisseaux réels (bien que cela n'a pas d'importance); Il s'agit davantage de définir une variable pour agir comme un flux de destination. Je suis paresseux et ne voulant pas réécrire à 50 messages de journalisation, voir. :-)


@Paul Nathan Je suis lié à la réponse de Brian D Foy. Utilisez log4perl. Exprimez votre $ Etat comme niveau de journalisation, définissez les actions. Je ne ajoute pas cela comme une réponse car je n'ai pas le temps de vérifier comment cela fonctionne, mais je recommande vivement log4perl basé sur une expérience passée.


7 Réponses :



1
votes

Son comme vous voulez Cravate CODE> Votre FileHandle .

my $x;

# printing to $fh will update the variable $x
# when you close $fh, it will print $x to a filehandle depending
# on code in the function  Print_to_variable::CLOSE 

tie $fh, "Print_to_variable", \$x, $output_fh1, $output_fh2;
print $fh "stuff";
print $fh "more stuff";
close $fh;

sub Print_to_variable::TIEHANDLE {
    my ($class, $ref, $fh1, $fh2) = @_;
    my $self = {};
    $self->{ref} = $ref;
    $self->{output_fh1} = $fh1;
    $self->{output_fh2} = $fh2;
    bless $self, "Print_to_variable";
    $self;
}
sub Print_to_variable::PRINT {
    my ($self,@list);
    ${$self->{ref}} .= join "", @list;
}
sub Print_to_variable::CLOSE {
    my $self = shift;
    my $text = ${$self->{ref}};
    if ( &myCondition1($text) ) {    # ... how you decide where to print 
        print {$self->{output_fh1}} $text;
    } else {
        print {$self->{output_fh1}} $text;
    }
}


1 commentaires

Je pense que oui, mais j'ai la durette aujourd'hui et je ne vois pas comment le cravate fonctionne réellement ici.



2
votes

perlfaq5 recommande TIE :: FileHandle: : Multiplex pour l'impression à plusieurs fichiers.

La source est très simple et il doit être facile de modifier avec un filtre par poignée.


0 commentaires

5
votes

Voulez-vous dire quelque chose comme io :: scalar ? Vous permet d'écrire à une variable avec la sémantique de FileHandle.


1 commentaires

Vous n'avez pas besoin d'Io :: scalaire explicitement. Open () par lui-même fonctionne juste bien.



1
votes

Ceci est un formidable pirater, et je pense que la solution de Mobrule ou la solution de Sinan de log4perl est la voie à suivre quand j'ai le temps.

Mais, c'est ce que je suis En utilisant, comme une chose d'achèvement: xxx

éditer:

Comme il s'agit de wiki communautaire, cela ne vaut rien que Perl alias des arguments à fonctions. Cela signifie que vous pouvez simplement écrire ceci: xxx

puis dit: xxx

Ce n'est pas un piratage particulièrement formidable, Bien que print_to_var est beaucoup plus taper que . est.

et voici le helo kittie:

Helo Kittie http://blogs.philadelphiaweekly.com/style/files/ 2008/11 / hello-kitty-color.gif


1 commentaires

Je suis amusé! Et je n'étais pas sûr de l'aliasing / référençant des arguments aux fonctions. Merci!



21
votes

Vous pouvez traiter une variable scalaire en tant que fichierHandle par Ouvrir code> A> ING IT:

close STDOUT;
open STDOUT, '>', \$variable or die "Can't open STDOUT: $!";


0 commentaires

4
votes

Si vous souhaitez effectuer une journalisation sélective là où vous pouvez contrôler quels messages sont connectés et où ils sont enregistrés, utilisez LOG :: log4perl . Cela vous fera économiser un tas de temps sur Messing avec Cravate S et autre magie noire.


0 commentaires