Si $name='name'
¿Por qué funciona $object_ref->$name
pero no $object_ref->('name')
?¿Cómo puedo llamar un nombre de función definido en una cadena literal en perl?
Respuesta
$obj->$name # Method call with no args
$obj->name # Method call with no args
$obj->$name() # Method call with no args
$obj->name() # Method call with no args
$sub->('name') # Sub call (via ref) with one arg.
sub('name') # Sub call with one arg.
La sintaxis para las llamadas a métodos es $object->method
o $object->$method
. Sin embargo, la sintaxis que proporcionó se puede usar para $sub_ref->(@param)
.
En Perl, el símbolo ->
tiene dos significados. Si está seguido por una palabra clave $obj->name
o un escalar $obj->$name
, entonces ->
significa método de llamada.
Si en lugar de la ->
es seguida por una llave de apertura, entonces es una dereference, de acuerdo con la siguiente tabla:
$obj->(...) # dereference as code, which calls the subroutine
$obj->[...] # dereference as array, which accesses an element
$obj->{...} # dereference as hash, which accesses an element
Cuando ->
se dereferencing un valor, Perl comprobar para ver si el valor es ya sea el tipo indicado por el corsé, o si se puede forzar en ese tipo a través de la sobrecarga. Entonces, el ->(
en su ejemplo significa que Perl intentará convertir $object_ref
en una referencia de código, y probablemente fallará, arrojando un error.
Si el ->
es una llamada a un método, a continuación, Perl hace algo como:
if (reftype $name eq 'CODE') { # if $name is code, ignore $object_ref's type
$name->($object_ref) # call the coderef in $name, with $object_ref
} # followed by any other arguments
elsif (my $code = $object_ref->can($name)) { # otherwise, try to look up the
# coderef for the method named $name in $object_ref's namespace and then
$code->($object_ref) # call it with the object and any other arguments
}
else {die "no method $name on $object_ref"}
Sólo para hacer las cosas más claras:
sub foo {"foo(@_)"}
my $foo = \&foo;
say foo 'bar'; # 'foo(bar)'
say $foo->('bar'); # 'foo(bar)'
say 'bar'->$foo; # 'foo(bar)'
y
sub Foo::bar {"Foo::bar(@_)"}
my $obj = bless [] => 'Foo';
my $method = 'bar';
say $obj->bar(1); # Foo::bar($obj, 1)
say $obj->$method(1); # Foo::bar($obj, 1)
- 1. En Perl, ¿cómo puedo llamar a un método cuyo nombre tengo en una cadena?
- 2. ¿Cómo puedo llamar a una subrutina cuyo nombre es un valor en un hash, en Perl?
- 3. Cómo devolver un literal de cadena desde una función
- 4. ¿Cómo puedo llamar un nombre de variable como parte de un nombre de función en ColdFusion?
- 5. ¿Cómo puedo preasignar una cadena en Perl?
- 6. ¿Cómo puedo encapsular una cadena en Perl?
- 7. Llamar a una función desde una cadena con el nombre de la función en Clojure
- 8. ¿Llamar a un nombre de función de JavaScript con una cadena?
- 9. ¿Cómo puedo convertir una cadena en un número en Perl?
- 10. ¿Cómo detectar el paso de un literal de cadena a una función en C?
- 11. ¿Cómo puedo crear un nombre de variable Perl basado en una cadena?
- 12. Llamar a una función basada en una cadena que contiene el nombre de la función
- 13. Usar una cadena para llamar a la función en Python
- 14. Cómo convierto un nombre de función en una cadena
- 15. función R que devuelve una cadena literal
- 16. ¿Cómo puedo llamar elegantemente a una subrutina Perl cuyo nombre se mantiene en una variable?
- 17. ¿Cómo puedo interpolar un elemento hash Perl en una cadena?
- 18. ¿Puedo escapar una comilla doble en una literal litera literal?
- 19. ¿Cómo puedo llamar a una clase Perl con un nombre más corto?
- 20. ¿Cómo puedo asignar una cadena a una función en Java?
- 21. Llamar a una función desde su nombre como una cadena en f #
- 22. cómo llamar dinámicamente una función en C#
- 23. ¿Cómo puedo pegar HTML en una cadena usando Perl?
- 24. ¿Cómo puedo pasar una matriz a una función en Perl?
- 25. vida útil de una cadena literal devuelto por una función
- 26. ¿Cómo puedo adivinar la codificación de una cadena en Perl?
- 27. ¿Cómo llamo a un nombre de función que está almacenado en un hash en Perl?
- 28. Llamar a una función de una cadena en C#
- 29. ¿Cómo puedo llamar a una función de SQL en C#?
- 30. ¿Cómo puedo extraer subcadenas de una cadena en Perl?