2010-06-22 62 views
16

En un SO answerdaxim estados:¿Qué significa "~~" en Perl?

@array ~~ $scalar is true when $scalar is in @array 

a la que draegtun respuestas:

De 5.10.1+ el orden de ~~ es importante. Por lo tanto tiene que ser $ escalar ~~ @array

¿Qué tal un pequeño manual sobre ~~ con enlace (s) a la fuente (s) que incluye las siguientes preguntas específicas: ¿Qué es ~~? ¿Cómo se llama ~~? ¿Por qué importa el orden en una versión pero no en una anterior?

Tenga en cuenta que un buen resumen puede no obtener todos los detalles y puede ser difícil de escribir. Una introducción o una cartilla sería muy útil para ahorrar tiempo a alguien que no esté familiarizado con ~~ mientras expande la exposición de este Perlism.

Search strings: non-word-tilde-tildenon-word-at-sign.

+2

Con la gente dando menos en casi todas las respuestas aquí, ¡tengo miedo de siquiera considerar publicar! : P – Jeriko

+3

Si tiene una pregunta específica que formular después de leer la documentación oficial, consúltela. – Ether

+0

'~~' es el operador de inchworm secreto que se puede utilizar para forzar el contexto escalar: '~~ localtime()' :-) –

Respuesta

23

Respondiendo específicamente "¿por qué la materia orden en una versión pero no en una anterior": el operador partido inteligente fue mal diseñado en 5.10.0 de una manera que dificultaba el uso confiable, y hacía que la construcción dada/cuando fuera menos útil de lo que podría ser, por lo que la semántica se cambió con 5.10.1 y todas las versiones futuras pretenderán que la versión 5.10.0 nunca existió.

En la versión 5.10.1+ de la coincidencia inteligente, el operando de la izquierda y el operando de la derecha en ~~ se tratan siempre de forma clara. Al igual que con el operador de concordancia regex =~, el lado izquierdo es el "sujeto" de la coincidencia, y el lado derecho es el "patrón" con el que debe coincidir, ya sea un escalar simple, una expresión regular, una matriz o referencia hash , una referencia de código, o lo que sea. Los detalles se detallan bastante bien en Perlsyn.

No debe preocuparse por la versión 5.10.0 a menos que ya haya escrito el código que depende de la 5.10.0 semántica (en cuyo caso, debe volver a escribir para requerir 5.10.1, o de lo contrario se romperá en todas las versiones futuras de perl).

+3

+1 para responder a la única parte de la pregunta no cubierta por RTFM. –

+0

@Michael Carman: ya que ~~ no funciona bien en las búsquedas "¿Cómo se llama ~~?" direcciones cómo encontrarlo en TFM. –

+2

@ C.W.Holeman II: ¿Podrías preguntar qué es '= ~'? ¿Qué tal '&&'? También podría hacer el mismo reclamo "difícil de buscar" sobre esos. A menos que esté preguntando por pseudo-operadores como '=() =' u ofuscaciones como '$ x -> 5' la respuesta sigue siendo la misma: vea perlop y perlsyn. –

18

inteligente partido, consideran perldoc perlsyn

por una solicitud en el comentario, voy a dar un poco más: inteligente Match es un operador para tipos de datos arbitrarios que intenta dar sentido a una prueba de la igualdad sin saber nada más que los tipos de argumentos, muchas de las pruebas requieren operaciones complejas como iteración y aplicación de expresiones regulares

+1

que a su vez es. ... ¿qué? – OscarRyz

+5

que a su vez es ... minuciosamente detallado justo detrás de ese enlace. – hobbs

+2

Creo que es difícil de explicar en palabras simples. : -/ – OscarRyz

5

(robada de Learn Perl): Binary "~~" hace una coincidencia inteligente entre sus argumentos.

http://perldoc.perl.org/perlsyn.html#Smart-matching-in-detail

¿Qué hacer? "Depende" principalmente del tipo de argumentos proporcionados. La página vinculada anteriormente tiene detalles insoportables sobre cuáles son las variaciones.

+0

Al parecer respondiendo "¿Qué es ~~? ¿Qué se llama ~~? ¿Qué tal un pequeño manual sobre ~~ con enlace (s) a fuente (s)" merece un voto negativo? De acuerdo, no contesté "¿Por qué importa el orden en una versión, pero no en la anterior?", Pero la página a la que me he vinculado lo hace implícitamente. – JasonTrue