salto - perl manejo de strings
Perl-while(<>) manejo de archivos (3)
Esta pregunta ya tiene una respuesta aquí:
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;
}