reject_invalid_helo_hostname pyzor configurar antispam perl

perl - pyzor - reject_invalid_helo_hostname zimbra



¿De qué sirve<> en Perl? (6)

¿De qué sirve <> en Perl. Cómo usarlo ? Si simplemente escribimos

<>;

y

while(<>)

¿Qué está haciendo el programa en ambos casos?


Citando perldoc perlop :

El identificador de archivo nulo <> es especial: se puede usar para emular el comportamiento de sed y awk, y cualquier otro programa de filtro de Unix que tome una lista de nombres de archivo, haciendo lo mismo con cada línea de entrada de todos ellos. La entrada desde <> proviene de la entrada estándar o de cada archivo listado en la línea de comando.


En muchos casos de programación con azúcar sintáctico como este, Deparse of O es útil para descubrir lo que está sucediendo:

$ perl -MO=Deparse -e ''while(<>){print 42}'' while (defined($_ = <ARGV>)) { print 42; } -e syntax OK


Las respuestas anteriores son todas correctas, pero podrían ser más claras si comprende el uso general de la línea de comandos de UNIX. Es muy común querer un comando para trabajar en múltiples archivos. P.ej

ls -l *.c

El shell de línea de comando (bash et al) lo convierte en:

ls -l a.c b.c c.c ...

en otras palabras, nunca veo ''* .c'' a menos que el patrón no coincida. Pruebe esto en un símbolo del sistema (no perl):

echo *

Notarás que no obtienes un *.

Entonces, si el intérprete de órdenes le está entregando un montón de nombres de archivos, y desea revisar los datos de cada uno, el operador <> de perl le brinda una buena manera de hacerlo ... pone la siguiente línea del siguiente archivo (o stdin si no se nombran archivos) en $ _ (el escalar predeterminado).

Aquí está el grep de un pobre:

while(<>) { print if m/pattern/; }

Ejecutando este script:

./t.pl *

imprimirá todas las líneas de todos los archivos que coinciden con el patrón dado.

cat /etc/passwd | ./t.pl

usaría cat para generar algunas líneas de texto que luego serían revisadas por el ciclo en perl.

Así que ya ves, mientras (<>) obtienes un comportamiento de línea de comandos de UNIX muy estándar ... procesa todos los archivos que te doy, o procesa lo que te transmití.



toma la entrada estándar STDIN:

> cat temp.pl #!/usr/bin/perl use strict; use warnings; my $count=<>; print "$count"."/n"; >

a continuación está la ejecución:

> temp.pl 3 3 >

así que tan pronto como ejecutes el script esperará hasta que el usuario dé alguna entrada. después 3 se da 3 como entrada, almacena ese valor en $count e imprime el valor en la siguiente declaración.


<>;

es una forma corta de escribir

readline();

o si agrega en el argumento predeterminado,

readline(*ARGV);

readline es un operador que lee una línea del manejador de archivo especificado. Leyendo desde el manejador de archivo especial ARGV leerá desde STDIN si @ARGV está vacío o desde la concatenación de los archivos nombrados por @ARGV si no es así.

Como para

while (<>)

Es un error de sintaxis Si tuvieras

while (<>) { ... }

se reescribe para

while (defined($_ = <>)) { ... }

Y como se explicó anteriormente, eso significa lo mismo que

while (defined($_ = readline(*ARGV))) { ... }

Eso significa que leerá líneas de (previamente explicado) ARGV hasta que no haya más líneas para leer.