2010-06-02 2 views
4

est ici l'extrait pertinent de la documentation de la fonction ref:

La valeur retournée dépend du type de chose la référence est une référence à. types BUILTIN comprennent:

SCALAR 
ARRAY 
HASH 
CODE 
REF 
GLOB 
LVALUE 
FORMAT 
IO 
VSTRING 
Regexp 

Sur cette base, je l'imaginais que l'appel ref sur un descripteur de fichier retournerait 'IO'. Étonnamment, il n'a pas:

use strict; 
use warnings; 

open my $fileHandle, '<', 'aValidFile'; 
close $fileHandle; 

print ref $fileHandle;  # prints 'GLOB', not 'IO' 

perlref tente d'expliquer pourquoi:

Il est impossible de créer un véritable référence à une poignée IO (ou de descripteur de fichier DIRHANDLE) en utilisant l'opérateur backslash . Le plus que vous pouvez obtenir est une référence à un typeglob, qui est en fait une table de symboles complète entrée [...] Cependant, vous pouvez toujours utiliser globsfs de type et globrefs comme si elles étaient des poignées IO.


Dans quelles circonstances ref retour 'IO' alors?

+0

I Je ne pense pas que l'extrait de "perlref" soit complètement pertinent ici, mais c'est le plus proche que je puisse trouver. – Zaid

+3

http://stackoverflow.com/questions/1399833/how-can-i-get-perls-ref-function-to-return-ref-io-and-lvalue – Konerak

Répondre

4

La seule façon d'obtenir une référence d'E/S est d'utiliser la syntaxe * FOO {THING}:Où glob est un glob nommé comme STDIN ou une référence comme $ fh. Mais une fois que vous avez une telle référence, elle peut être transmise ou stockée dans des structures de données arbitraires comme n'importe quel autre scalaire, donc des choses comme les modules de marshalling doivent être bien informés.

Puisqu'un glob ou globref peut être utilisé comme un descripteur de fichier et obtenir implicitement l'objet IO contenu, il n'y a pas beaucoup de besoin pour les références d'E/S. La principale exception est la suivante:

use Symbol; 
# replace *FOO{IO} handle but not $FOO, %FOO, etc. 
*FOO = geniosym; 

(geniosym retourne une nouvelle semi-anonyme référence IO, et toute cession non glob référence à glob n'attribue à ce particulier de la part de référence du glob)

2

Comme le dit Konerak, la réponse est dans cette question:

How can I get Perl's ref() function to return REF, IO, and LVALUE?

L'extrait pertinent est:

use Acme::Damn; 
say 'IO:  ', ref damn *STDIN{IO}; # really prints IO 

et ce code de production ne devrait pas vraiment être utilisé car putain enlève la bénir de la référence ...

+0

Hmm ...Est-ce le seul cas où 'ref' retournerait '' IO''? – Zaid

+1

@Zaid - voir l'excellente réponse de ysth ... +1 pour celui-là :) – DVK