Estoy recibiendo un hash de hashes de otra función, y algunos elementos del hash de hash pueden ser otro hash. ¿Cómo puedo probar para ver si algo es un hash?¿Cómo puedo probar que "algo" es un hash en Perl?
Respuesta
Dependiendo de lo que quiere usted tendrá que utilizar ref
o reftype
(que está en Scalar::Util
, un módulo básico). Si la referencia es un objeto, ref
devolverá la clase del objeto en lugar del tipo de referencia subyacente, reftype
siempre devolverá el tipo de referencia subyacente.
if (ref $var eq ref {}) {
print "$var is a hash\n";
}
use Scalar::Util qw/reftype/;
if (reftype $var eq reftype {}) {
print "$var is a hash\n";
}
@brian d foy ¿No estás familiarizado con la palabra "tf"? Es como "si", pero más aún. –
Entonces, ¿una versión más fuerte de si? ¿Hay una versión más débil también? –
@brain d foy Sí, hay "ɨf". –
Uso ref
función:
ref($hash_ref) eq 'HASH' ## $hash_ref is reference to hash
ref($array_ref) eq 'ARRAY' ## $array_ref is reference to array
ref($hash{$key}) eq 'HASH' ## there is reference to hash in $hash{$key}
Esta prueba no funciona para los objetos tipo hash: '$ r = {}; bless $ r," fail "; print ref $ r' – mob
No creo violando encapsulación de objetos es una buena idea. –
También hay algunos falsos positivos aquí. '$ array = []; bless $ array, 'HASH'; print ref $ array; 'prints' HASH'. No es que nunca deberías hacer esto. –
use Params::Util qw<_HASH _HASH0 _HASHLIKE>;
# for an unblessed hash with data
print "$ref is a hash\n" if _HASH($ref);
# for an unblessed hash empty or not
print "$ref is a hash\n" if _HASH0($ref);
# for a blessed hash OR some object that responds as a hash*
print "$ref is hashlike\n" if _HASHLIKE($ref);
* a través overload
Es probable que no necesita la última, sin embargo.
ver Params::Util
'Params :: Util :: _ HASHLIKE' llamadas' Scalar :: Util :: reftype', pero también comprueba si su argumento está sobrecargando el operador hash-dereferencing - esto detecta objetos que pueden pretender ser hashrefs incluso cuando no son realmente hashrefs. – mob
@mobrule: Sí, lo sé. Solo pensé que presentar dos opciones lo llevaría al enlace para ver la diferencia. Agregué una nota diciendo que probablemente no lo necesita. – Axeman
Siempre he usado isa
, pero si lo que se está probando no es un objeto (o puede que no sea un objeto), es necesario llamar a la función UNIVERSAL::isa
:
if (UNIVERSAL::isa($var, 'HASH')) { ... }
- 1. ¿Cómo puedo probar la unidad de algo que utiliza VisualTreeHelper?
- 2. ¿Cómo puedo combinar varios hashes en un hash en Perl?
- 3. ¿Cómo puedo construir un hash Perl en código C?
- 4. ¿Cómo puedo imprimir el contenido de un hash en Perl?
- 5. ¿Cómo puedo interpolar un elemento hash Perl en una cadena?
- 6. C# ¿Cómo puedo probar que un archivo es un jpeg?
- 7. En Perl, ¿cómo proceso un hash completo?
- 8. ¿Cómo puedo llamar a una subrutina cuyo nombre es un valor en un hash, en Perl?
- 9. Rieles: ¿cómo puedo validar que algo es un booleano?
- 10. ¿Cómo puedo hacer una nueva referencia hash vacía en Perl?
- 11. Constantes hash en Perl
- 12. ¿Cómo puedo ordenar un hash de hash por clave en Perl?
- 13. ¿Cómo saber si un hash Perl es multidimensional?
- 14. ¿Cómo puedo probar STDIN sin bloquear en Perl?
- 15. ¿Cómo puedo almacenar múltiples valores en una tabla hash Perl?
- 16. ¿Cómo puedo obtener una parte única de hash en Perl?
- 17. Cómo borrar un hash de Perl
- 18. Atravesar un hash multidimensional en Perl
- 19. ¿Cómo paso un hash a una función en Perl?
- 20. ¿Cómo cargo un archivo en un hash Perl?
- 21. ¿Cómo puedo usar una clave hash Perl que tiene un punto literal?
- 22. Perl expresiones regulares para que coincida con un hash MD5?
- 23. ¿Cómo puedo mantener el orden de las claves que agrego a un hash Perl?
- 24. ¿Cómo puedo probar cuando se agregó una característica a Perl?
- 25. ¿Cómo puedo representar los enlaces simbólicos de un sistema de archivos en un hash Perl?
- 26. ¿Cómo puedo probar una secuencia de comandos de Perl independiente?
- 27. ¿Cómo creo un hash de hashes en Perl?
- 28. ¿Cómo presiono un valor en un hash Perl de matrices?
- 29. ¿Cómo llamo a un nombre de función que está almacenado en un hash en Perl?
- 30. Perl Hash de subfunciones
posible duplicado de [¿Cómo puedo saber qué tipo de valor hay en una variable Perl?] (Http://stackoverflow.com/questions/1731333/how-do-i-tell-what-type-of-value -is-in-a-perl-variable) – Ether