perl types sigils

¿Cuál es la diferencia entre `$ this`,` @ that`, y `% those` en Perl?



types sigils (5)

El inventor de Perl era lingüista e intentó hacer de Perl un "lenguaje natural".

De esta publicación :

Desambiguación por número, caso y orden de las palabras

Parte de la razón por la cual un lenguaje puede salirse con la suya con ciertas ambigüedades locales es que otras ambigüedades son reprimidas por varios mecanismos. El inglés usa el número y el orden de las palabras, con vestigios de un sistema de casos en los pronombres: "El hombre miró a los hombres y le devolvieron la mirada". Está perfectamente claro en esa oración quién está haciendo qué a quién. Del mismo modo, Perl tiene marcadores de números en sus sustantivos; es decir, $ perro es un perro y @dog es (potencialmente) muchos. Entonces $ y @ son un poco como "esto" y "estos" en inglés . [énfasis añadido]

¿Cuál es la diferencia entre $this , @that , y %those de Perl?


Es posible que desee consultar los documentos perlintro y perlsyn para poder comenzar a entender Perl (es decir, leer el manual de volteo). :-)

Eso dijo:

  • $this es un escalar, que puede almacenar un número (int o float), una cadena o una referencia (ver a continuación);
  • @that es una matriz, que puede almacenar una lista ordenada de escalares (ver arriba). Puede agregar un escalar a una matriz con las funciones de push o unshift (consulte perlfunc ), y puede usar una lista separada por comas de literales o variables escalares para crear una matriz literal (es decir, my @array = ($a, $b, 6, "seven"); )
  • %those es un hash, que es una matriz asociativa. Los valores hash tienen pares de entradas clave-valor, de modo que puede acceder al valor de un hash proporcionando su clave. Los literales hash también se pueden especificar como listas, excepto que cada entrada impar es una clave y cada uno es un valor. También puede usar un carácter => lugar de una coma para separar una clave y un valor. (es decir, my %ordinals = ("one" => "first", "two" => "second"); )

Normalmente, cuando pasa matrices o hash a llamadas de subrutina, las listas individuales se aplanan en una lista larga. Esto es a veces deseable, a veces no. En este último caso, puede usar referencias para pasar una referencia a una lista completa como un argumento escalar único. Sin embargo, la sintaxis y la semántica de las referencias son engañosas y caen más allá del alcance de esta respuesta. Si desea verificarlo, sin embargo, consulte perlref .


La gente a menudo trata de unir los sigilos a tipos variables, pero solo están relacionados de manera vaga. Es un tema que tocó mucho en Learning Perl y en la Programación Perl Efectiva porque es mucho más fácil de entender Perl cuando entiendes sigils.

Mucha gente olvida que las variables y los datos son en realidad cosas separadas. Las variables pueden almacenar datos, pero no necesita variables para usar datos.

El $ denota un único valor escalar (no necesariamente una variable escalar):

$scalar_var $array[1] $hash{key}

El @ denota valores múltiples. Esa podría ser la matriz en conjunto, una rebanada o una desreferencia:

@array; @array[1,2] @hash{qw(key1 key2)} @{ func_returning_array_ref };

El % denota pares (claves y valores), que pueden ser una variable hash o una desreferencia:

%hash %$hash_ref

Bajo Perl v5.20, el % ahora puede denotar un segmento clave / valor o un hash o matriz:

% array [@indices]; # devuelve pares de índices y elementos% hash {@keys}; # devuelve pares de pares clave-valor para esas teclas


Una nota mnemotécnica útil para los sigilos de Perl son:

  • $ calar
  • @rray
  • %ceniza

Matt Trout escribió un gran comentario en blog.fogus.me sobre Perl blog.fogus.me que creo que es útil, así que lo he pegado a continuación:

En realidad, los sigls de Perl no denotan el tipo de variable - denotan conjugación - $ es ''el'', @ es ''estos'',% es ''mapa de'' o más - el tipo de variable se denota vía [] o {}. Puedes ver esto con:

my $foo = ''foo''; my @foo = (''zero'', ''one'', ''two''); my $second_foo = $foo[1]; my @first_and_third_foos = @foo[0,2]; my %foo = (key1 => ''value1'', key2 => ''value2'', key3 => ''value3''); my $key2_foo = $foo{key2}; my ($key1_foo, $key3_foo) = @foo{''key1'',''key3''};

así que mirar el sigilo cuando skimming el código perl te dice qué vas a hacer, en lugar de en qué estás operando, más o menos.

Esto es, sin duda, realmente confuso hasta que te acostumbras, pero una vez que estás acostumbrado, puede ser una herramienta extremadamente útil para absorber información mientras se roba el código.

Todavía tienes derecho a odiarlo, por supuesto, pero es un concepto interesante y supongo que preferirías odiar lo que realmente está sucediendo en lugar de lo que pensabas que estaba sucediendo :)


$this es un valor escalar, contiene 1 elemento como apple

@that es una matriz de valores, contiene varios como ("apple", "orange", "pear")

%those es un hash de valores, contiene pares de valores clave como ("apple" => "red", "orange" => "orange", "pear" => "yellow")

Ver perlintro para más información sobre los tipos de variables Perl.