¿Cómo debo utilizar la palabra clave "mi" en Perl?

90

Sigo viendo la palabra clave "mi" delante de los nombres de las variables en los scripts de Perl de ejemplo en línea, pero no tengo idea de lo que significa. Intenté leer las páginas del manual y otros sitios en línea, pero tengo dificultades para discernir para qué sirve dada la diferencia entre cómo veo que se usa y el manual.

Por ejemplo, se usa para obtener la longitud de la matriz en esta publicación: Encuentre el tamaño de una matriz en Perl

Pero el manual dice:

A my declara que las variables enumeradas son locales (léxicamente) al bloque, archivo o evaluación adjunto. Si se incluye más de un valor, la lista debe colocarse entre paréntesis.

¿Qué hace y cómo se usa?

Puño de la furia
fuente
3
Re "se usa para obtener la longitud de la matriz en esta publicación", en absoluto. myno tuvo en cuenta en lo más mínimo. Es el operador de asignación escalar ( =) que aplicó el contexto escalar en @arr.
ikegami
Si no es realmente "tuyo", no debes usarlo.
icenac

Respuestas:

141

myrestringe el alcance de una variable. El alcance de una variable es donde se puede ver. Reducir el alcance de una variable a donde se necesita la variable es un aspecto fundamental de una buena programación. Hace que el código sea más legible y menos propenso a errores, y da como resultado una gran cantidad de beneficios derivados.

Si no declara una variable mediante my, se creará una variable global en su lugar. Esto debe evitarse. El uso use strict;le dice a Perl que desea evitar la creación implícita de variables globales, por lo que siempre debe usar use strict;(y use warnings;) en sus programas.


Lectura relacionada: ¿Por qué usar use strict;y use warnings;?

ikegami
fuente
11
Finalmente una respuesta que explica por qué .
ThisSuitIsBlackNot
Para las personas que vienen aquí desde JS: es esencialmente como vary leten JavaScript. Sin 'use strict';JS le permitirá declarar nuevas variables globales sin ninguna de las palabras clave, lo que no se considera la mejor práctica.
Café eléctrico
@Electric Coffee, En términos de JS, la pregunta sería "¿Qué hace lety varqué hace y cómo se deben utilizar?" Y sí, la respuesta sería aproximadamente la misma. (Las letvars de JS son muy parecidas a las myvars de Perl , excepto que las letvars no se pueden capturar)
ikegami
Solo quise decir que si la gente viniera a Perl desde JS, sería una manera fácil de explicar el mismo concepto
Café eléctrico
@ElectricCoffee 1) Un programador que comprende el alcance no necesita que se le explique nuevamente después de cambiar de idioma. 2) No estoy seguro de haber explicado el alcance, en términos que un programador JS entendería o no. ¿Quizás estabas intentando explicar use strict;? Pero esa no era la cuestión, y use strict;hace más que eso. O tal vez quisiste comunicar que mylimita el alcance de las vars como lety varhacer, pero esa es prácticamente la primera oración de la respuesta. 3) Si desea responder una pregunta de manera diferente, para eso están las Respuestas.
ikegami
27

Resumen rápido: mycrea una nueva variable, localmodifica temporalmente el valor de una variable

En el siguiente ejemplo, $ :: a se refiere a $ a en el espacio de nombres 'global'.

$a = 3.14159;
{
  my $a = 3;
  print "In block, \$a = $a\n";
  print "In block, \$::a = $::a\n";
}
print "Outside block, \$a = $a\n";
print "Outside block, \$::a = $::a\n";

# This outputs
In block, $a = 3
In block, $::a = 3.14159
Outside block, $a = 3.14159
Outside block, $::a = 3.14159

es decir, localcambia temporalmente el valor de la variable, pero solo dentro del ámbito en el que existe.

Fuente: http://www.perlmonks.org/?node_id=94007

Actualizar

Sobre la diferencia entre oury mypor favor vea

(Gracias a ThisSuitIsBlackNot ).

Igor Chubin
fuente
¿Te importaría explicar 'su'? Siempre los encontré confusos.
rdodev
@rdodev: ¿Qué quieres decir?
Igor Chubin
Sigo viendo el código de Perl con 'my' y 'their' y nunca entendí la diferencia, en la práctica.
rdodev
@rdodev: ¿podría enviarme un enlace a algún código con their?
Igor Chubin
3
@rdodev Creo que te refieres a our: stackoverflow.com/questions/845060/…
ThisSuitIsBlackNot
4

Variables privadas a través de my () es la documentación principal para my.

En el ejemplo de tamaño de matriz que menciona, no se usa para encontrar el tamaño de la matriz. Se usa para crear una nueva variable para contener el tamaño de la matriz.

cjm
fuente