2009-09-09 6 views
4

La documentation pour ref() mentionne plusieurs valeurs de retour possibles. Je comprends la plupart d'entre eux, mais pas REF, IO et LVALUE. Comment écrire du code Perl pour que ref renvoie ces valeurs?Comment puis-je obtenir la fonction REF() de Perl pour retourner REF, IO et LVALUE?

Après avoir lu la documentation sur typeglobs and file handles, je suis venu près de IO avec ce code:

open(INPUT, '<', 'foo.pl'); 
print ref(*INPUT{IO}), "\n"; # Prints IO::Handle 

Pour REF et LVALUE j'ai essayé plusieurs constructions bizarres, mais sans succès.

Répondre

14

est ici un moyen rapide et facile à produire la plupart d'entre eux:

use 5.010; 
say 'SCALAR: ', ref \undef; 
say 'ARRAY: ', ref [1..5]; 
say 'HASH: ', ref { key => 'value' }; 
say 'CODE: ', ref sub {}; 
say 'REF:  ', ref \\undef; 
say 'GLOB: ', ref \*_; 
say 'LVALUE: ', ref \substr "abc", 1, 2; 
say 'LVALUE: ', ref \vec 42, 1, 2; 
say 'FORMAT: ', ref *STDOUT{FORMAT}; # needs declaration below 
say 'IO:  ', ref *STDIN{IO}; # actually prints IO::Handle 
say 'VSTRING: ', ref \v5.10.0; 
say 'Regexp: ', ref qr/./; 

format = 
. 

REF est juste une référence à une autre référence. LVALUE est un cas particulier d'un scalaire qui a une influence externe s'il est modifié. IO est le type de base derrière les poignées, vous pouvez le faire apparaître explicitement en utilisant Acme::Damn from CPAN. Comme l'a noté Michael Carman dans les commentaires, vous ne devriez pas être des objets non-clérignant   — ne pas utiliser en code réel.

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

La source de la fonction ref a également des bits de code pour afficher « BIND » et « UNKNOWN », mais il ne devrait pas être un moyen d'obtenir les sans déconner avec les internes. Blead a aussi un intéressant "REGEXP" (différent du "Regexp" ci-dessus); Si quelqu'un sait comment faire ref céder ...

+2

Aussi délicieux que soit le nom «damn», il est peu probable que vous souhaitiez supprimer la bénédiction. Utilisez 'Scalar :: Util :: reftype()' pour voir passé le 'bless' au type de référence sous-jacent. –

+0

Merde! J'ai oublié Scalar :: Util! :-D Malheureusement, je n'arrive pas à l'utiliser pour rendre 'ref' return" IO ". Je vais ajouter un avertissement à propos de "damn" ne pas être sérieux; Merci pour le rappel. –

2
  1. LVALUE

    perl5.8 -e '{$a = "aaa"; $b = \substr($a, 0, 2); print "$$b\n"; print ref($b)."\n"}'
    aa

    LVALUE

    Celui-ci est expliqué dans perldoc -f ref

  2. REF

    perl5.8 -e '{$a = "aaa"; $b = \\$a; print ref($b)."\n"}'

    REF

    Il est en fait une référence à une valeur qui lui-même est une référence. aurait probablement été préférable de faire $b = \$a; $c = \$b; print ref($c)

4

REF signifie que vous avez une référence à une référence:

my ($x, $y, $z); 
$x = 1; 
$y = \$x; 
$z = \$y; 
print ref $z; # REF 

LVALUE refs sont rares, mais vous pouvez les obtenir à partir de certaines fonctions qui retournent lvalues . substr est un:

$x = 'abcdefg'; 
$y = \ substr($x, 0, 3); 
print ref $y; # LVALUE 

IO::Handle objets sont réellement bénis IO refs:

$x = *STDIN{IO}; 
print ref $x; # IO::Handle 
print $x;  # IO::Handle=IO(0x12345678) 

Je ne sais pas comment obtenir un IO ref directement.

Questions connexes