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 ...
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. –
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. –