2008-10-06 22 views

Respuesta

36

=:= pruebas si dos contenedores (variables o elementos de arrays o hashes) son alias, es decir, si se cambia, lo hace otro cambio así?

my $x; 
my @a = 1, 2, 3; 
# $x =:= @a[0] is false 
$x := @a[0]; 
# now $x == 1, and $x =:= @a[0] is true 
$x = 4; 
# now @a is 4, 2, 3 

cuanto a los demás: === pruebas si dos referencias apuntan al mismo objeto, y eqv pruebas si dos cosas son estructuralmente equivalentes. Entonces [1, 2, 3] === [1, 2, 3] será falso (no la misma matriz), pero [1, 2, 3] eqv [1, 2, 3] será verdadero (misma estructura).

leg compara cadenas como Perl 5 de cmp, mientras que Perl 6 cmp es más inteligente y comparará números como <=> y cadenas como leg.

13 leg 4 # -1, because 1 is smaller than 4, and leg converts to string 
13 cmp 4 # +1, because both are numbers, so use numeric comparison. 

Finalmente ~~ es el "partido inteligente", que responde a la pregunta "hace $x partido $y". Si $y es un tipo, es un tipo de verificación. Si $y es una expresión regular, es una coincidencia de expresiones regulares, y así sucesivamente.

+1

Perl 5 no tiene 'eqv'. Creo que querías decir 'cmp' allí. – cjm

17
+0

Gracias, pero todavía no entiendo qué = = = hace. ¿Y cuál es la diferencia entre leg y cmp? – raldi

+0

Hasta donde yo sé, =: = solo importa si ha asignado alias. De acuerdo con http://perlgeek.de/blog-en/perl-5-to-6/ cmp ahora se ha renombrado como leg, por lo que deberían ser iguales. – Randy

+0

No son lo mismo (y espero que no lo haya dicho de esa manera en ese blog), cmp es "más inteligente" que leg. – moritz

12

¿El resumen en Synopsis 3: Comparison semantics hace lo que quiere, o ya lo estaba leyendo? Los documentos de diseño se vinculan a los archivos de prueba donde se usan esas características, por lo que puede ver ejemplos de su uso y su estado de prueba actual.

Los operadores de comparación Perl 6 son mucho más adecuados para un lenguaje dinámico y todas las cosas que están sucediendo. En lugar de simplemente comparar cadenas o números (o convertir cosas en cadenas o números), ahora puede probar cosas con precisión con un operador que hace lo que quiere. Puede probar el valor, el contenedor, el tipo, etc.

En uno de los comentarios, usted pregunta acerca de eqv y cmp. En los viejos tiempos de Perl 5, cmp estaba allí para ordenar y devuelve uno de los tres valores mágicos (-1,0,1), y siempre lo hacía con la semántica de cadenas. En Perl 6, cmp devuelve uno de tres tipos de objetos Order, por lo que no tiene que recordar qué significa -1, 0 o 1. Además, el nuevo cmp no fuerza la semántica de cadena, por lo que puede ser más inteligente cuando se entregan números (a diferencia de Perl 5 que ordenaría como 1, 10, 11, 2, 20, 21 ...).

El leg (l ess que, e qual, g reater que) es cmp con la semántica de cadena. Se define como Perl 6 ~$a cmp ~$b, donde ~ es el nuevo "contextualizador de cadenas" que fuerza la semántica de cadenas. Con leg, siempre está haciendo una comparación de cadenas, al igual que el antiguo Perl 5 cmp.

Si aún tiene preguntas sobre los otros operadores, desglosémoslas en preguntas separadas. :)

+0

Véase también http://docs.perl6.org/ - puede buscar operadores individuales allí. – Coke

2

Ésta es también una práctica guía de referencia:

Perl6 Periodic Table of Operators

+1

Esta impresión, aunque preciosa, no está actualizada con la versión actual de la especificación, Perl 6.c – Coke

+0

@Coke, esto * fue * escrito en 2010, pero el que responde sigue siendo un usuario activo, así que les deseo Lo actualizaría – cat

+0

@tac la respuesta está marcada como 'comunidad wiki' para que cualquiera pueda editarla. O bien, podría aclarar en un comentario qué actualización está esperando. – Ether

Cuestiones relacionadas