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í.
Se llama el operador de diamante y alimenta los datos de cualquiera de los archivos stdin si ARGV está vacío o cada línea de los archivos nombrados en ARGV. Esta página web http://docstore.mik.ua/orelly/perl/learn/ch06_02.htm explica muy bien.
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.