read por open linea leer ejemplos copiar archivos archivo perl stdin

por - Programado leer desde STDIN o archivo de entrada en Perl



perl read file line by line (8)

¿Cuál es la forma más hábil de leer programáticamente desde stdin o un archivo de entrada (si se proporciona) en Perl?


Aquí es cómo hice una secuencia de comandos que podría tomar cualquiera de las entradas de la línea de comandos o tener un archivo de texto redirigido.

if ($#ARGV < 1) { @ARGV = (); @ARGV = <>; chomp(@ARGV); }


Esto reasignará los contenidos del archivo a @ARGV, a partir de ahí solo procesará @ARGV como si alguien estuviera incluyendo opciones de línea de comando.

ADVERTENCIA

Si no se redirige ningún archivo, el programa permanecerá inactivo porque está esperando la entrada de STDIN.

No he descubierto una forma de detectar si un archivo está siendo redirigido aún para eliminar el problema STDIN.


Esto proporciona una variable nombrada para trabajar con:

foreach $line ( <STDIN> ) { chomp( $line ); print "$line/n"; }

Para leer un archivo, canalícelo de esta manera:

program.pl < inputfile


Hacer

$userinput = <STDIN>; #read stdin and put it in $userinput chomp ($userinput); #cut the return / line feed character

si quieres leer solo una línea


La forma "más hábil" en ciertas situaciones es aprovechar el -n . Envuelve implícitamente su código con un ciclo while(<>) y maneja la entrada de manera flexible.

En slickestWay.pl :

#!/usr/bin/perl -n BEGIN: { # do something once here } # implement logic for a single line of input print $result;

En la línea de comando:

chmod +x slickestWay.pl

Ahora, dependiendo de su entrada, haga una de las siguientes cosas:

  1. Espere a la entrada del usuario

    ./slickestWay.pl

  2. Leer desde el archivo (s) nombrado en argumentos (no se requiere redirección)

    ./slickestWay.pl input.txt ./slickestWay.pl input.txt moreInput.txt

  3. Usa una pipa

    someOtherScript | ./slickestWay.pl

El bloque BEGIN es necesario si necesita inicializar algún tipo de interfaz orientada a objetos, como Text :: CSV o algo así, que puede agregar al shebang con -M .

-l y -p también son tus amigos.


Necesita usar el operador <>:

while (<>) { print $_; # or simply "print;" }

Que se puede compactar a:

print while (<>);

Archivo arbitrario:

open F, "<file.txt" or die $!; while (<F>) { print $_; } close F;


Si hay una razón por la cual no puede usar la solución simple provista por ennuikiller arriba, entonces deberá usar Typeglobs para manipular manejadores de archivos. Esto es mucho más trabajo. Este ejemplo copia del archivo en $ARGV[0] a aquél en $ARGV[1] . Su valor predeterminado es STDIN y STDOUT respectivamente, si los archivos no están especificados.

use English; my $in; my $out; if ($#ARGV >= 0){ unless (open($in, "<", $ARGV[0])){ die "could not open $ARGV[0] for reading."; } } else { $in = *STDIN; } if ($#ARGV >= 1){ unless (open($out, ">", $ARGV[1])){ die "could not open $ARGV[1] for writing."; } } else { $out = *STDOUT; } while ($_ = <$in>){ $out->print($_); }


if(my $file = shift) { # if file is specified, read from that open(my $fh, ''<'', $file) or die($!); while(my $line = <$fh>) { print $line; } } else { # otherwise, read from STDIN print while(<>); }


while (<>) { print; }

leerá desde un archivo especificado en la línea de comando o desde stdin si no se proporciona ningún archivo

Si se requiere esta construcción de bucle en línea de comando, entonces puede usar la opción -n :

$ perl -ne ''print;''

Aquí solo pones el código entre {} del primer ejemplo en '''' en segundo