strings salto por open manejo linea leer fichero entrada ejecutar datos con como cadena buscar archivos archivo perl while-loop cycle filehandle

salto - perl manejo de strings



Perl-while(<>) manejo de archivos (3)

Un programa simple con while( <> ) maneja los archivos dados como argumentos ( ./program 1.file 2.file 3.file ) y la entrada estándar de los sistemas Unix.

Creo que los concatena en un solo archivo y el trabajo es línea por línea. El problema es, ¿cómo sé que estoy trabajando con el primer archivo? Y luego con el segundo.

Para un ejemplo simple, quiero imprimir el contenido del archivo en una línea.

while( <> ){ print "/n" if (it''s the second file already); print $_; }


El <> es un caso especial del operador readline. Por lo general, toma un <$fh> : <$fh> .

Si la ARGV se deja fuera, entonces se usa la ARGV mágica.

Si no se dan argumentos de línea de comando, entonces ARGV es STDIN . Si se dan argumentos de línea de comando, entonces ARGV se open a cada uno de ellos. Esto es similar a

# Pseudocode while ($ARGV = shift @ARGV) { open ARGV, $ARGV or do{ warn "Can''t open $ARGV: $!"; next; }; while (<ARGV>) { ...; # your code } }

La variable $ARGV es real y contiene el nombre de archivo del archivo actualmente abierto.

Tenga en cuenta que la forma open de dos argumentos (que probablemente se usa aquí detrás de la escena), es bastante insegura. El nombre del archivo rm -rf * | Puede que no hagas lo que quieres.


El nombre del archivo actual para <> está contenido en la variable especial $ARGV .

Puede hacer una @ARGV cruzada de su lista de archivos de la @ARGV parámetros @ARGV con el nombre del archivo actual para obtener la posición del archivo en la lista. Suponiendo que los únicos parámetros que espera son los nombres de archivo, simplemente puede hacer:

my %filename_positions = map { ( $ARGV[$_] => $_ ) } 0..$#ARGV; while (<>) { my $file_number = $filename_positions{$ARGV}; #... if ($file_number == 0) { #first file }


El operador de diamante no concatena los archivos, simplemente los abre y los lee consecutivamente. Cómo controlar esto depende de cómo lo necesite controlado. Una forma sencilla de verificar cuando hemos leído la última línea de un archivo es usar eof :

while (<>) { chomp; # remove newline print; # print the line print "/n" if eof; # at end of file, print a newline }

También puede considerar un contador para realizar un seguimiento de qué archivo para procesar

$counter++ if eof;

Tenga en cuenta que este recuento aumentará en uno en la última línea del archivo, por lo que no lo use prematuramente.

Si desea realizar un seguimiento de la línea número $. en el identificador de archivo actual, puede close el identificador de archivo ARGV para restablecer este contador:

while (<>) { print "line $. : ", $_; close ARGV if eof; }