2011-05-13 30 views
5

Me pregunto por qué Perl tiene capacidad para pasar argumentos por referencia a la función? Sé que ni Python ni Ruby tienen esa característica.¿Por qué Perl permite pasar los argumentos por referencia?

+2

¿Quiere decir pasar implícito o explícito de referencia? Tal vez proporcione un ejemplo de lo que quiere decir. – TLP

+0

¿Por qué querría omitir la capacidad de pasar argumentos por referencia? –

+0

Parece que los alias '@ _' contenían una característica accidental de la que la gente dependía desde los 3 días de Perl, o tal vez con 'para '. Las búsquedas del archivo p5p y del repositorio git han quedado vacías, pero @tchrist o @merlyn sabrán la respuesta. –

Respuesta

7

Es útil distinguir una cosa de otra.

(1) Pasar argumentos a una subrutina por referencia. Esto es útil en Perl porque el lenguaje pasa todos los argumentos a una subrutina como una lista de valores indiferenciada. Sin la capacidad de pasar estructuras de datos por referencia, el diseñador de una función que tome dos listas, por ejemplo, no podrá mantener separadas las listas. Además, si las estructuras de datos son grandes, pasarlas por referencia puede proporcionar una ganancia de rendimiento.

process_two_lists(@x, @y); # Can't distinguish the lists. 
process_two_lists(\@x, \@y); # Can. 

Dado que Python y Ruby se diseñan de forma diferente, no requieren esta distinción en la forma en que se pasan los argumentos. Un método similar en Python o Ruby recibiría dos argumentos distintos (dos objetos que representan las listas x y y).

(2) el comportamiento de Perl cual @_ sirve como un alias a los argumentos pasados, lo que permite la subrutina para modificar los datos según la percepción de la persona que llama.

sub add_ten_to_me { 
    $_[0] += 10; 
} 

my $x = 1; 
add_ten_to_me($x); 
say $x;   # 11 Amazing! 

Python y Ruby también pueden hacer este tipo de cosas; Sin embargo, hay algunas calificaciones. Python distingue entre mutable y objetos inmutables. Si pasa algo mutable a un método de Python (una lista, por ejemplo), el método puede modificar la estructura de datos. Entonces, una versión Python de process_two_lists podría modificar tanto x como y. Sin embargo, una función que recibe objetos inmutables (un entero, por ejemplo) no lo haría. Por lo tanto, un análogo de Python directo de add_ten_to_me no funcionaría. [Creo que se podrían hacer puntos similares sobre Ruby, pero estoy menos familiarizado con los detalles en este momento.]

+1

Creo que el # 2 es lo que la gente suele llamar "referencia de paso a paso". # 1 se llama pasar una referencia – user102008

6

Pasar argumentos por referencia puede proporcionar mejoras significativas en el rendimiento.

4

Perl le da la opción. Creo que es parte de esa idea TIMTOWTDI. Es un método flexible, por lo que puede hacer lo que necesita. Si accede al argumento como $_[0], entonces es el mismo objeto. Si lo desplaza o lo copia a un léxico, es por valor.

Así que piénselo de esta manera. La mayoría del código es por valor, pero por referencia está ahí cuando lo necesita.

Cuestiones relacionadas