2012-11-28 4 views
1

question simple:Perl: Comment déclarer et mettre en œuvre la fonction `say`

Je veux écrire une fonction comme say.

Mais il avait une mauvaise caractéristique: un handle de fichier.

 say FILEHANDLE LIST 
     say FILEHANDLE 
     say LIST 
     say 

Comment le déclarer? C'est possible? Je trouve un exemple avec myopen(*;$), mais ce n'est pas la même chose.
P.P.S: J'ai besoin de cette fonction dans les anciennes versions de Perl, car il est ennuyeux d'écrire print "\n"

Merci!

+1

Je ne pense pas que ce soit possible, 'say' sur un handle de fichier est en fait une méthode indirecte. Tout ce que vous pouvez imaginer aura besoin d'une virgule. –

Répondre

9

Perl6::Say fait exactement cela.

Il émule intelligemment la syntaxe say FILEHANDLE TEXT en tirant parti de indirect method call syntax généralement très ennuyeux de Perl. Il charge IO::Handle en transformant chaque handle de fichier en objet et crée IO::Handle->say. Maintenant say FILEHANDLE TEXT est actuellement FILEHANDLE->say(TEXT).

Il a des mises en garde. De the docs ...

Use it just like print (except that it only supports the indirect 
object syntax when the stream is a bareword). That is, assuming 
the relevant filehandles are open for output, you can use any of these: 

say @data; 
say FH @data; 
FH->say(@data); 
*FH->say(@data); 
(\*FH)->say(@data); 
say $fh, @data; 
$fh->say(@data); 

but not any of these: 

say {FH} @data; 
say {*FH} @data; 
say {\*FH} @data; 
say $fh @data; 
say {$fh} @data; 

MISE À JOUR: Pour ce faire encore plus simple, je viens de téléchargé Say::Compat qui charge soit Perl6 :: Say ou use feature 'say' en fonction de votre version de Perl.

C'est le meilleur que vous êtes susceptible d'obtenir sans jouer avec Devel::Declare.

+0

euh, pas de trucs et de magie, seulement des modules, merci! – gaussblurinc

+2

@loldop J'ai simplifié le processus en écrivant Say :: Compat. Voir la modification à la publication pour plus de détails. – Schwern

+0

Notes: 1) 'say $ fh @data;' devrait fonctionner aussi bien que 'say FH @ data', malgré les docs qui disent le contraire. 2) 'say $ fh, @data;' ne fonctionne pas comme il se doit (mais ce n'est pas vraiment un problème). 3) Cette astuce donne le mauvais résultat pour 'my $ _ =" abc "; disons. – ikegami

1

say ne peut pas être recréé par des sous-marins.

>perl -E"say prototype('CORE::say') // 'Special'" 
Special 

Vous aurez besoin d'un analyseur d'appel et d'un vérificateur d'appel pour y parvenir. Voir Syntax::Feature::Loop pour un exemple.

+0

hm, quelle version de perl? aussi je veux écrire la fonction _like_ 'say' – gaussblurinc

+0

Dans n'importe quelle version de Perl. Ou vous voulez dire parser/checker d'appel? Malheureusement, 5.14 pour la fonctionnalité complète, bien que 5.12 a une version "allégée". Il existe des outils plus grossiers utilisables dans les anciennes versions (Devel :: Declare ?, plugin mot-clé, ...?), Mais je ne suis pas très familier avec eux. – ikegami

Questions connexes