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 > 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> 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);
7 Réponses :
Je cours sur Windows (fichier :: tee ne pas). ajoutant cela à la question.
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;
}
}
Je pense que oui, mais j'ai la durette aujourd'hui et je ne vois pas comment le cravate fonctionne réellement ici.
perlfaq5 recommande TIE :: FileHandle: : Multiplex pour l'impression à plusieurs fichiers. P>
La source est très simple et il doit être facile de modifier avec un filtre par poignée. P>
Voulez-vous dire quelque chose comme io :: scalar ? Vous permet d'écrire à une variable avec la sémantique de FileHandle. P>
Vous n'avez pas besoin d'Io :: scalaire explicitement. Open () par lui-même fonctionne juste bien.
Ceci est un formidable em> 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: p> éditer: p> 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: p> puis dit: p> Ce n'est pas un piratage particulièrement formidable, Bien que et voici le helo kittie: p> print_to_var code> est beaucoup plus taper que . code> est. p>
Je suis amusé! Et je n'étais pas sûr de l'aliasing / référençant des arguments aux fonctions. Merci!
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: $!";
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 Code> S et autre magie noire. P>
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 code> 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.