strawberry logo lane historia ejemplos perl

logo - perl vs python



¿Qué significa ''/' en Perl? (4)

Crea una referencia a la variable en el lado derecho; algo así como un puntero en C (sin la aritmética del puntero) o un puntero en Java.

Consulte perlref para obtener más información sobre el tema.

La diferenciación se realiza a través de $$a para escalares, @$a para matrices, etc.

Actualmente estoy aprendiendo acerca de la "desreferenciación" en Perl y necesito su ayuda para comprender lo que significa "/" en la línea a continuación.

$ra = /$a;


La documentación de Perl es excelente y completa, utilícela temprano y con frecuencia. Puedo recomendar perldoc perlreftut , el tutorial de referencias de perl o perldoc perlref para obtener más información. Luego perldoc perlintro y perldoc perltoc o perldoc perl para ver a dónde ir desde allí.

Y sí, crea una referencia a la variable $ a y la almacena en la variable $ ra.


Ver perlop .

Unario "/" crea una referencia a lo que sigue. Ver perlreftut y perlref . No confunda este comportamiento con el comportamiento de barra diagonal inversa dentro de una cadena, aunque ambas formas transmiten la noción de proteger lo siguiente de la interpolación.


Como he escrito anteriormente en otra parte ...

Unary / crea una referencia a lo que la sigue. Utilizado en una lista, crea una lista de referencias.

No confunda este comportamiento con el comportamiento de barra invertida dentro de una cadena, aunque ambas formas transmiten la noción vagamente negativa de proteger lo siguiente de la interpretación. Este parecido no es del todo accidental.

Puede crear una referencia a cualquier variable o subrutina nombrada con una barra invertida. También puede usarlo en un valor escalar anónimo como 7 o "camel" , aunque a menudo no lo necesitará. Este operador funciona como el operador & (dirección de) en C o C⁺⁺, al menos a primera vista.

Aquí hay unos ejemplos:

$scalarref = /$foo; $constref = /186_282.42; $arrayref = /@ARGV; $hashref = /%ENV; $coderef = /&handler; $globref = /*STDOUT;

El operador de barra invertida puede hacer más que producir una sola referencia. Generará una lista completa de referencias si se aplica a una lista.

Como se mencionó anteriormente, el operador de barra invertida generalmente se usa en un solo referente para generar una sola referencia, pero no tiene que serlo. Cuando se usa en una lista de referentes, produce una lista de referencias correspondientes. La segunda línea del siguiente ejemplo hace lo mismo que la primera línea, ya que la barra invertida se distribuye automáticamente en toda la lista.

@reflist = (/$s, /@a, /%h, /&f); # List of four references @reflist = /($s, @a %h, &f); # Same thing

Si una lista entre paréntesis contiene exactamente una matriz o un hash, entonces todos sus valores se interpolan y se devuelven referencias a cada uno:

@reflist = /(@x); # Interpolate array, then get refs @reflist = map { /$_ } @x; # Same thing

Esto también ocurre cuando hay paréntesis internos:

@reflist = /(@x, (@y)); # But only single aggregates expand @reflist = (/@x, map { /$_ } @y); # Same thing

Si lo intenta con un hash, el resultado contendrá referencias a los valores (como cabría esperar), pero referencias a copias de las claves (como es de esperar).

Debido a que los cortes de matriz y hash son realmente solo listas, puede hacer una barra diagonal inversa de uno de estos para obtener una lista de referencias. Cada una de las siguientes cuatro líneas hace exactamente lo mismo:

@envrefs = /@ENV{"HOME", "TERM"}; # Backslashing a slice @envrefs = /@ENV{ qw<HOME TERM> }; # Backslashing a slice @envrefs = /( $ENV{HOME}, $ENV{TERM} ); # Backslashing a list @envrefs = ( /$ENV{HOME}, /$ENV{TERM} ); # A list of two references

Como las funciones pueden devolver listas, puede aplicarles una barra invertida. Si tiene más de una función a la que llamar, primero interpole los valores de retorno de cada función en una lista más grande y, a continuación, haga una barra inversa de la barra completa:

@reflist = /fx(); @reflist = map { /$_ } fx(); # Same thing @reflist = /( fx(), fy(), fz() ); @reflist = ( /fx(), /fy(), /fz() ); # Same thing @reflist = map { /$_ } fx(), fy(), fz(); # Same thing

El operador de barra invertida siempre proporciona un contexto de lista a su operando, por lo que todas las funciones se llaman en el contexto de lista. Si la barra invertida está en el contexto escalar, terminará con una referencia al último valor de la lista devuelta por la función:

@reflist = /localtime(); # Ref to each of nine time elements $lastref = /localtime(); # Ref to whether it’s daylight savings time

En este sentido, la barra diagonal inversa se comporta como los operadores de lista Perl nombrados, como print , reverse y sort , que siempre proporcionan un contexto de lista a su derecha, sin importar lo que pueda estar sucediendo a su izquierda. Al igual que con los operadores de lista nombrados, use un scalar explícito para forzar lo que sigue en el contexto escalar:

$dateref = /scalar localtime(); # /"Sat Nov 13 10:41:30 2010"

Y ahora ya sabes ... el resto de la historia.

(con disculpas al difunto Paul Harvey)