2012-01-18 10 views
17

Duplicar posible:
When should I use the & to call a Perl subroutine?y la función y la función() en Perl

En los scripts de Perl, por eso es que el método de invocar la función que está escrito de manera diferente algunas veces. Veo la función & y, a veces, la función(). ¿Son los dos iguales y esto es solo un estilo que uno querría alardear? Si son iguales, ¿por qué ambos están disponibles? ¿No bastaría uno? Supongo que hay una diferencia semántica entre los métodos que los distinguen unos de otros ... ¿pero en qué tipo de circunstancias?

--- Ya que no puedo responder mi propia pregunta por razones de tiempo de espera - Estoy actualizando la respuesta en la sección de la pregunta misma. Cuando tenga la oportunidad de actualizar el bloque de respuestas, lo pondré allí.

Encontré el texto relevante en el libro 'Learning Perl' ... gracias por la sugerencia. Capítulo 4: Subrutinas - Omitir el signo distintivo.

Estaba más interesado en el ampersand & uso para las funciones perl. Si ya se ha definido una subrutina antes de invocarse, se puede invocar la subrutina sin utilizar & al llamar a la función de forma similar a invocar las funciones incorporadas. & también se usa para distinguir entre las funciones incorporadas y las funciones definidas por el usuario si la función que se invoca usa el mismo nombre que el de una de las funciones incorporadas, siempre que se defina antes de invocarse.

El uso de(), es simplemente para justificar el paso de los argumentos a las subrutinas, mientras que si no se usa, la lista predeterminada de argumentos actuales se pasa en la forma @_. Si los argumentos se especifican en() para una subrutina, se supone que es una subrutina y se invoca incluso si no se definió previamente durante el análisis.

+11

Ver [¿Cuál es la diferencia entre llamar a una función como & foo y foo()?] (Http://perldoc.perl.org/perlfaq7.html#What%27s-the-difference-between-calling-a-function -as-% 26foo-and-foo% 28% 29% 3F) en Perl FAQ 7. – manatwork

+0

Hola @manatwork, que explica la diferencia entre & foo y & foo(), pero ¿por qué se usa el ampersand en caso de ser necesario ... cuando ¿es necesario? –

+0

En la sección Descripción [perlsub] (http://perldoc.perl.org/perlsub.html) enumera cuándo es '&' opcional. – manatwork

Respuesta

4

Según lo mencionado por @manatwork y @KeithThompson puede encontrar información en estos artículos:

  1. Una descripción general - What's the difference between calling a function as &foo and foo()?
  2. información sutil sobre el uso de & o no para una llamada de función - perlsub: Perl Subroutines: Description.
+0

En caso de que se esté preguntando acerca de mi charla única. edit: Su respuesta _renderred_ con una URL URL codificada incorrectamente (aunque fue correcta en la fuente de Margen), que causó que la parte de anclaje de "¿Cuál es la diferencia ..." no funcione correctamente (una aterrizó en la parte superior de la página de destino larga en lugar de en el ancla de interés). Sospecho que se trataba de un error histórico de renderizado de Markdown que se ha solucionado desde entonces para _new_ answers. Al forzar su respuesta a ser salvada nuevamente, el problema desapareció. – mklement0

18

Tiene usos muy específicos:

  • & dice Perl ignorar prototipo del submarino.
  • & puede permitirle usar la persona que llama @_. (&foo; sin parens o argumentos).
  • goto &foo; y defined &foo.
  • Obteniendo una referencia (por ejemplo, \&foo).

Algunas personas (en su mayoría principiantes) lo utilizan para distinguir los submarinos de usuario de las funciones incorporadas, ya que las funciones incorporadas no pueden ir precedidos de &.

+0

¿Qué otra manera existe para distinguir los subs de usuarios de los edificios internos? – jackthehipster

+2

@jackthehipster, convenciones de nombres, aunque cuestiono la necesidad de hacerlo. A quién le importa quién lo escribió ¿Importa que 'utf8 :: encode' sea un built-in y que' Encode :: encode_utf8' no lo sea? – ikegami

Cuestiones relacionadas