2010-04-28 10 views
32

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

+3

Estaba a punto de quejarme de que esto es una estafa muchas veces, pero mientras puedo encontrar preguntas sobre por qué Perl usa sigils que explican lo que significan los sigilos, no hay un pregunta específicamente preguntando "¿Qué significan?"Así que +1 –

+0

También puede encontrar útil esta pregunta relacionada: http://stackoverflow.com/questions/1235837/whats-a-simple-ref – dreeves

+7

Puede encontrar la documentación útil. ¿Realmente tenemos que repetir la pregunta más básica? ¿El contenido del manual de usuario aquí? – Svante

Respuesta

21

$this es un valor escalar, se mantiene 1 artículo como apple

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

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

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

+4

perldoc es realmente bastante bueno: http://perldoc.perl.org/perldata.html (o ejecute 'perldoc perldata', si tiene documentación instalada). – Cascabel

+10

Nota al margen: los valores $ escalares se utilizan a menudo para apuntar a (referencias) matrices y hashes (y a veces incluso otros escalares). –

+2

@Frank - Sí, eso y las matrices pueden ser utilizado como hashes. Mi favorito está en sub s con parámetros nombrados: 'my ($ foo, $ bar) = @ {@_} {qw/foo bar /};' – amphetamachine

3

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

Dicho:

  • $this es un escalar, que puede almacenar un número (int o float), una cadena, o una referencia (véase más adelante);
  • @that es una matriz, que puede almacenar una lista ordenada de escalares (ver arriba). Puede añadir un escalar a una matriz con los push o unshift funciones (véase perlfunc), y se puede usar una lista separada por comas paréntesis acotada de literales escalares o variables 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 => en lugar de una coma para separar una clave y un valor. (Es decir, my %ordinals = ("one" => "first", "two" => "second");)

Normalmente, cuando se pasa matrices o hashes de llamadas a subprogramas, las listas individuales se aplanan en una larga lista. 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, vea perlref.

+0

Nota al margen: en Perl (antes de Perl 6), cuando accede a una matriz o hash para recuperar un solo elemento, en ese punto el símbolo '$' es utilizado para ese acceso; esto se debe a que mientras estás cavando en una matriz o hash, lo que en realidad estás CONSIGUIENDO es un escalar, y Larry Wall (el creador de Perl) creía que tenía más sentido usar el sigilo escalar para indicar que el valor que tienes re getting se puede usar en cualquier lugar donde se pueda usar una variable escalar normal. –

+0

en Perl v5.20, puede aplicar un '%' a una matriz o un hash para obtener un [segmento de clave-valor] (http://www.effectiveperlprogramming.com/2014/07/perl-5-20 -introduces-keyvalue-slices /) –

31

Una mnemotécnica útil para sigilos Perl son:

  • $ calar
  • @rray
  • % de cenizas

Matt Trout escribió un gran comentario sobre blog.fogus.me sobre sigilos Perl que creo que es útil, así que pegué a continuación:

En realidad, los sigls de perl no denotan tipo de variable - denotan conjugación - $ es 'el', @ es 'estos',% es 'mapa de' más o menos - el tipo de variable se denota vía [] o {}.Esto se puede ver 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'}; 

por lo que mira el sigilo cuando descremado código Perl te dice lo que va a -get- en lugar que lo que se está operando en, más o menos.

Esto es, sin duda, realmente confuso hasta que te acostumbras, pero una vez que -es- acostumbrado a él puede ser una herramienta extremadamente útil para absorber información mientras se roza el código.

Estás siendo perfectamente derecho a odiarlo, por supuesto, pero es un concepto interesante y yo averiguar si lo prefiere, a odiar lo que está pasando -actually- en lugar de lo que pensaba que era pasando :)

+0

No es correcto asociar fuertemente sigils con tipos de variables. Es la razón por la que mucha gente tiene problemas con ellos. Sería mucho mejor para ti eliminar todo antes de "Matt". –

+1

@brian d foy: No veo nada de malo en la publicación citada, tiene mucho sentido para mí, pero de nuevo recogí Perl realmente de alguna manera. Entonces, ¿qué pasa si hace una mala cita para ti, si no te importa que pregunte? –

+0

Creo que te perdiste la palabra "antes" en mi comentario. Las cosas de Matt son "después". :) –

7

El inventor de Perl era lingüista, y trató de hacer de Perl un "lenguaje natural".

De this post:

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

Parte de la razón una lengua puede salirse con ciertas ambigüedades locales es que otras ambigüedades son suprimidas por diversos 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. So $ y @ son un poco como "esto" y "estos" en inglés. [énfasis añadido]

+1

Y $ _ es "eso". – AmbroseChapel

7

Las personas a menudo intentan unir sigils a tipos variables, pero están poco relacionados. Es un tema que golpeamos muy duro en Learning Perl y Effective Perl Programming 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 solo valor escalar (no necesariamente una variable escalar):

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

El @ denota varios valores. Eso podría ser la matriz como un todo, una rebanada, o una dereference:

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

El % denota pares (claves y valores), que podría ser una variable de hash o una dereference:

%hash 
%$hash_ref 

Bajo Perl v5.20, el % ahora puede denotar un key/value slice o un hash o matriz:

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

+0

Nota al margen: también puede tener referencias escalares: cuál sería el punto, no sé, pero puede. La eliminación de referencias se hace con algo como '$$ scalar_ref'. –

+2

Las referencias escalares son agradables para pasar datos grandes sin copiarlos. –

Cuestiones relacionadas