¿Cuáles son algunas de las características de lenguaje realmente útiles pero esotéricas en Perl que realmente has podido emplear para hacer un trabajo útil?
Pautas:
- Intente limitar las respuestas al núcleo de Perl y no a CPAN
- Por favor da un ejemplo y una breve descripción
Las características ocultas también se encuentran en las características ocultas de otros idiomas:
(Todo esto es de la respuesta de Corion )
- C
- Dispositivo de Duff
- Portabilidad y Estandaridad
- C#
- Cotizaciones para listas y cadenas delimitadas por espacios en blanco
- Espacios de nombres aliables
- Java
- Initalizadores Estáticos
- JavaScript
- Las funciones son ciudadanos de primera clase.
- Bloqueo de alcance y cierre
- Llamando métodos y accesos indirectamente a través de una variable
- Rubí
- Definiendo métodos a través del código
- PHP
- Documentación en línea generalizada
- Métodos mágicos
- Referencias simbólicas
- Pitón
- Intercambio de valor de una línea
- Capacidad para reemplazar incluso las funciones principales con su propia funcionalidad
Otras características ocultas:
Operadores:
- El cuasi-operador bool
- El operador de flip-flop
- También se usa para la construcción de listas
- Los
++
operadores y unarios-
trabajan en cadenas - El operador de repetición.
- El operador de la nave espacial
- El || operador (y // operador) para seleccionar de un conjunto de opciones
- El operador de diamantes
- Casos especiales del
m//
operador - El "operador" tilde-tilde
Citando construcciones:
- El operador qw
- Las letras se pueden usar como delimitadores de comillas en q {} - como construcciones
- Mecanismos de cotización
Sintaxis y Nombres:
- Puede haber un espacio después de un sigilo
- Puede dar nombres numéricos subs con referencias simbólicas
- Comas legales finales
- Literales enteros agrupados
- rodajas de picadillo
- Rellenar claves de un hash desde una matriz
Módulos, pragmas y opciones de línea de comandos:
- usar advertencias estrictas y advertencias
- Comprobación de contaminación
- Uso esotérico de -n y -p
- CPAN
overload::constant
- IO :: Módulo de manija
- Compartimentos seguros
- Atributos
Variables:
- Autovivificación
- La
$[
variable - Corbata
- Alcance dinámico
- Intercambio variable con una sola declaración
Bucles y control de flujo:
Expresiones regulares:
Otras características:
- El depurador
- Bloques de código especiales como BEGIN, CHECK y END
- El
DATA
bloque - Nuevas operaciones de bloque
- Filtros de origen
- Ganchos de señal
- mapa ( dos veces )
- Ajuste de funciones integradas
- La
eof
función - La
dbmopen
función - Convertir advertencias en errores
Otros trucos y meta respuestas:
Ver también:
perl
hidden-features
Adam Bellaire
fuente
fuente
Respuestas:
El operador de flip-flop es útil para omitir la primera iteración al recorrer los registros (generalmente líneas) devueltos por un identificador de archivo, sin usar una variable de indicador:
Ejecute
perldoc perlop
y busque "flip-flop" para obtener más información y ejemplos.fuente
Hay muchas características no obvias en Perl.
Por ejemplo, ¿sabías que puede haber un espacio después de un sigilo?
¿O que puede dar nombres numéricos subs si usa referencias simbólicas?
También está el cuasi operador "bool", que devuelve 1 para expresiones verdaderas y la cadena vacía para falsas:
Otras cosas interesantes: con
use overload
usted puede sobrecargar los literales de cadena y los números (y, por ejemplo, hacerlos BigInts o lo que sea).Muchas de estas cosas están realmente documentadas en alguna parte, o se siguen lógicamente de las características documentadas, pero no obstante, algunas no son muy conocidas.
Actualización : otra buena. A continuación se
q{...}
mencionaron las construcciones de comillas, pero ¿sabía que puede usar letras como delimitadores?Del mismo modo, puede escribir expresiones regulares:
fuente
Agregue soporte para archivos comprimidos a través de magic ARGV :
(cita alrededor de $ _ necesario para manejar nombres de archivos con metacaracteres de shell)
Ahora la
<>
función descomprimirá cualquier@ARGV
archivo que termine con ".gz" o ".Z":fuente
|
en el reemplazo.zcat |
analiza como un comando para canalizar?@ARGV
Una de mis características favoritas en Perl es usar el
||
operador booleano para seleccionar entre un conjunto de opciones.Esto significa que uno puede escribir:
para dar el primer valor verdadero de
$a
,$b
y$c
, o un incumplimiento de0
lo contrario.En Perl 5.10, también está el
//
operador, que devuelve el lado izquierdo si está definido, y el lado derecho de lo contrario. Los siguientes selecciona la primera definido valor de$a
,$b
,$c
, o0
de otro modo:Estos también se pueden usar con sus formas abreviadas, que son muy útiles para proporcionar valores predeterminados:
Cheerio
Pablo
fuente
Los operadores ++ y unario: no solo funcionan en números, sino también en cadenas.
impresiones -a
impresiones b
imprime aa
fuente
--
no funciona con cuerdas.ord()
. O escriba una clase pequeña y sobrecargue a los operadores para que lo hagan por usted.Como Perl tiene casi todas las partes "esotéricas" de las otras listas, le diré una cosa que Perl no puede:
Lo único que Perl no puede hacer es tener URL arbitrarias desnudas en su código, porque el//
operador se usa para expresiones regulares.En caso de que no fuera obvio para usted qué características ofrece Perl, aquí hay una lista selectiva de las entradas quizás no totalmente obvias:
Dispositivo de Duff - en Perl
Portabilidad y estandarización : es probable que haya más computadoras con Perl que con un compilador de C
Una clase de manipulación de archivos / rutas : File :: Find funciona incluso en más sistemas operativos que .Net
Cotizaciones para listas y cadenas delimitadas por espacios en blanco : Perl le permite elegir citas casi arbitrarias para su lista y delimitadores de cadena
Espacios de nombres aliables : Perl los tiene mediante asignaciones globales:
Inicializadores estáticos : Perl puede ejecutar código en casi todas las fases de compilación y creación de instancias de objetos, desde
BEGIN
(análisis de código) aCHECK
(después del análisis de código) aimport
(en la importación del módulo) anew
(creación de objetos) aDESTROY
(destrucción de objetos) aEND
(salida del programa)Las funciones son ciudadanos de primera clase , como en Perl
Bloqueo de alcance y cierre : Perl tiene ambas
Llamando métodos y accesores indirectamente a través de una variable : Perl también lo hace:
Definición de métodos a través del código : Perl también lo permite :
Documentación en línea omnipresente - documentación de Perl está en línea y probablemente en su sistema demasiado
Métodos mágicos que se llaman cada vez que se llama una función "no existente": Perl implementa eso en la función AUTOLOAD
Referencias simbólicas : se recomienda mantenerse alejado de ellas. Se comerán a tus hijos. Pero, por supuesto, Perl le permite ofrecer a sus hijos demonios sedientos de sangre.
Intercambio de valores de una línea : Perl permite la asignación de listas
Capacidad para reemplazar incluso las funciones principales con su propia funcionalidad
o
fuente
Autovivification . AFAIK no tiene otro idioma .
fuente
Es simple citar casi cualquier tipo de cadena extraña en Perl.
De hecho, los diversos mecanismos de cotización en Perl son bastante interesantes. Los mecanismos de comillas tipo Regex de Perl le permiten citar cualquier cosa, especificando los delimitadores. Puede usar casi cualquier carácter especial como #, / o caracteres de apertura / cierre como (), [] o {}. Ejemplos:
Mecanismos de cotización:
q: cita literal; El único personaje que necesita escapar es el personaje final. qq: una cita interpretada; procesa variables y caracteres de escape. Ideal para cadenas que necesita citar:
qx: funciona como qq, pero luego lo ejecuta como un comando del sistema, no de forma interactiva. Devuelve todo el texto generado a partir de la salida estándar. (La redirección, si es compatible con el sistema operativo, también sale) También se hace con comillas inversas (el carácter `).
qr: Interpreta como qq, pero luego lo compila como una expresión regular. Funciona con las diversas opciones en la expresión regular también. Ahora puede pasar la expresión regular como una variable:
qw: un operador de cotizaciones muy, muy útil. Convierte un conjunto de palabras separadas por espacios en blanco en una lista. Excelente para completar datos en una prueba unitaria.
Son geniales para usarlos cada vez que aclara las cosas. Para qx, qq y q, lo más probable es que use los operadores {}. El hábito más común de las personas que usan qw suele ser el operador (), pero a veces también se ve qw //.
fuente
my $moreout = qx{type "$path" 2>&1};
... ¡No sabía que podías hacer eso! [TM]No está realmente oculto, pero muchos programadores de Perl no saben todos los días acerca de CPAN . Esto se aplica especialmente a las personas que no son programadores a tiempo completo o que no programan en Perl a tiempo completo.
fuente
La declaración "for" se puede usar de la misma manera que "with" se usa en Pascal:
Puede aplicar una secuencia de s /// operaciones, etc. a la misma variable sin tener que repetir el nombre de la variable.
NOTA: el espacio que no se rompe arriba (& nbsp;) ha ocultado Unicode para evitar el Markdown. No copie y pegue :)
fuente
El operador quoteword es una de mis cosas favoritas. Comparar:
y
Mucho menos ruido, más fácil para la vista. Otra cosa realmente buena de Perl, que uno realmente echa de menos cuando escribe SQL, es que una coma final es legal:
Eso parece extraño, pero no si sangra el código de otra manera:
Agregar un argumento adicional a la llamada a la función no requiere que juegues con comas en líneas anteriores o finales. El cambio de una sola línea no tiene impacto en sus líneas circundantes.
Esto hace que sea muy agradable trabajar con funciones variadas. Esta es quizás una de las características más subestimadas de Perl.
fuente
for (<a list of stuff>) { ... }
La capacidad de analizar datos directamente pegados en un bloque DATA . No es necesario guardar en un archivo de prueba para abrirlo en el programa o similar. Por ejemplo:
fuente
Nuevas operaciones de bloque
Yo diría que la capacidad de expandir el lenguaje, crear operaciones de pseudobloque es una.
Declaras el prototipo de un sub que indica que primero toma una referencia de código:
Entonces puedes llamarlo así en el cuerpo
(
Data::Dumper::Dumper
es otra gema semi-oculta). Observe cómo no necesita lasub
palabra clave frente al bloque o la coma antes del hash. Termina pareciéndose mucho a:map { } @list
Filtros de origen
Además, hay filtros de origen. Donde Perl te pasará el código para que puedas manipularlo. Tanto esto como las operaciones de bloque son prácticamente cosas que no se intentan en casa.
He hecho algunas cosas interesantes con filtros de origen, por ejemplo, crear un lenguaje muy simple para verificar el tiempo, permitiendo breves frases de Perl para tomar decisiones:
Lib::TL
simplemente buscaría las "variables" y las constantes, las crearía y las sustituiría según fuera necesario.Una vez más, los filtros de origen pueden ser desordenados, pero son potentes. Pero pueden confundir a los depuradores con algo terrible, e incluso las advertencias se pueden imprimir con los números de línea incorrectos. Dejé de usar Damian's Switch porque el depurador perdería toda capacidad de decirme dónde estaba realmente. Pero descubrí que puede minimizar el daño modificando pequeñas secciones de código, manteniéndolos en la misma línea.
Ganchos de señal
A menudo se hace lo suficiente, pero no es tan obvio. Aquí hay un manipulador de dados que se apoya en el viejo.
Eso significa que siempre que algún otro módulo en el código quiera morir, tienen que acudir a usted (a menos que alguien más realice una sobrescritura destructiva
$SIG{__DIE__}
). Y se le puede notificar que alguien piensa que algo es un error.Por supuesto, para suficientes cosas puedes usar un
END { }
bloque, si todo lo que quieres hacer es limpiar.overload::constant
Puede inspeccionar literales de cierto tipo en paquetes que incluyen su módulo. Por ejemplo, si usa esto en su
import
sub:significará que cada entero mayor de 2 mil millones en los paquetes de llamadas se cambiará a un
Math::BigInt
objeto. (Ver sobrecarga :: constante ).Literales enteros agrupados
Mientras estamos en eso. Perl le permite dividir grandes números en grupos de tres dígitos y aún así obtener un número entero analizable. Nota
2_000_000_000
arriba por 2 mil millones.fuente
->slice
método como método cada vez que se necesita un corte.La "x" binaria es el operador de repetición :
También funciona con listas:
fuente
Comprobación de contaminación. Con la comprobación de contaminación habilitada, Perl morirá (o advertirá, con
-t
) si intenta pasar datos contaminados (en términos generales, datos desde fuera del programa) a una función insegura (abrir un archivo, ejecutar un comando externo, etc.). Es muy útil al escribir scripts de setuid o CGI o cualquier cosa en la que el script tenga mayores privilegios que la persona que lo alimenta.Goto mágico
goto &sub
hace una cola optimizada.El depurador.
use strict
yuse warnings
. Estos pueden salvarte de un montón de errores tipográficos.fuente
Según la forma en que se implementan los interruptores
"-n"
y"-p"
en Perl 5, puede escribir un programa aparentemente incorrecto que incluya}{
:que se convierte internamente a este código:
fuente
Comencemos fácil con el operador de la nave espacial .
fuente
($a->lname cmp $b->lname) || ($a->fname cmp $b->fname)
clasifica a las personas por sus apellidos, pero si dos personas tienen el mismo apellido, se ordenarán por su nombre.Esta es una meta respuesta, pero los archivos de Consejos de Perl contienen todo tipo de trucos interesantes que se pueden hacer con Perl. El archivo de consejos anteriores está en línea para navegar, y se puede suscribir a través de una lista de correo o un feed de átomos.
Algunos de mis consejos favoritos incluyen la construcción de ejecutables con PAR , el uso de autodie para lanzar excepciones automáticamente y el uso del interruptor y las construcciones de coincidencia inteligente en Perl 5.10.
Divulgación: Soy uno de los autores y mantenedores de Perl Tips, por lo que obviamente los considero muy bien. ;)
fuente
map - no solo porque hace que el código sea más expresivo, sino porque me dio el impulso de leer un poco más sobre esta "programación funcional".
fuente
La cláusula continue en bucles. Se ejecutará en la parte inferior de cada bucle, incluso en los siguientes.
fuente
Mi voto sería para los grupos (? {}) Y (?? {}) en las expresiones regulares de Perl. El primero ejecuta el código Perl, ignorando el valor de retorno, el segundo ejecuta el código, utilizando el valor de retorno como una expresión regular.
fuente
s/(pattern)/reverse($1);/ge;
# invierte todopatterns
.uninames
,unichars
y especialmenteuniprops
para ver solo una parte de lo que quiero decir.El ancla \ G. Es caliente .
fuente
El
m//
operador tiene algunos casos especiales oscuros:?
como delimitador, solo coincide una vez, a menos que llamereset
.'
como delimitador, el patrón no se interpola.fuente
El operador de null filehandle diamond
<>
tiene su lugar en la construcción de herramientas de línea de comandos. Actúa como si se<FH>
leyera desde un identificador, excepto que selecciona mágicamente lo que se encuentre primero: nombres de archivo de línea de comando o STDIN. Tomado de perlop:fuente
perl myscript.pl file1.txt - file2.txt
, y Perl procesará el primer archivo, luego stdin, luego el segundo archivo.overload
el<>
operador en sus propios objetos (<$var>
) trabaje como un iterador. Sin embargo, no funciona como cabría esperar en el contexto de la lista.Bloques de código especiales como
BEGIN
,CHECK
yEND
. Vienen de Awk, pero funcionan de manera diferente en Perl, porque no está basado en registros.El
BEGIN
bloque se puede usar para especificar algún código para la fase de análisis; también se ejecuta cuando realiza la verificación de sintaxis y variableperl -c
. Por ejemplo, para cargar variables de configuración:fuente
renombra data.txt.part a data.txt sin tener que repetirme.
fuente
Un poco oscuro es el "operador" tilde-tilde que fuerza el contexto escalar.
es lo mismo que
y diferente de
fuente
~~
, que puede hacer coincidencias de expresiones regulares, puede ver si un elemento está contenido en una matriz, etc.empate, la interfaz de vinculación variable.
fuente
El "modo de desesperación" de las construcciones de control de bucle de Perl que hace que busquen en la pila para encontrar una etiqueta coincidente permite algunos comportamientos curiosos que Test :: More aprovecha, para bien o para mal.
Ahí está el poco conocido archivo .pmc. "use Foo" buscará Foo.pmc en @INC antes de Foo.pm. Esto tenía la intención de permitir que el bytecode compilado se cargara primero, pero Module :: Compile aprovecha esto para almacenar en caché los módulos filtrados de origen para tiempos de carga más rápidos y una depuración más fácil.
La capacidad de convertir las advertencias en errores.
Eso es lo que puedo pensar en la parte superior de mi cabeza que no se ha mencionado.
fuente
El operador de cabra
*
:o
Funciona porque la asignación de listas en contexto escalar produce el número de elementos en la lista que se asigna.
*
Tenga en cuenta que no es realmente un operadorfuente