¿Cuál es la manera más hábil de leer programáticamente desde stdin o un archivo de entrada (si está provisto) en Perl?Leer programáticamente desde STDIN o archivo de entrada en Perl
Respuesta
while (<>) {
print;
}
aparece ya sea a partir de una archivo especificado en t que la línea de comandos o de la entrada estándar si no hay ningún archivo se da
Si se le requiere esta construcción de bucle en la línea de comandos, entonces puede usar -n
opción:
$ perl -ne 'print;'
Aquí sólo hay que poner el código entre {}
del primer ejemplo ''
en el segundo
Es necesario utilizar <> operador:
while (<>) {
print $_; # or simply "print;"
}
que puede ser compactado a:
print while (<>);
arbitraria de archivos:
open F, "<file.txt" or die $!;
while (<F>) {
print $_;
}
close F;
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(<>);
}
El operador '' '' simple buscará y leerá automáticamente de cualquier archivo (s) dado (s) en la línea de comando. No es necesario el 'si'. –
Tampoco se describe lo que 'shift' está haciendo aquí –
hacer
$userinput = <STDIN>; #read stdin and put it in $userinput
chomp ($userinput); #cut the return/line feed character
si desea leer una sola línea
Solo lee desde STDIN, no desde el archivo especificado. El operador de diamantes es * exactamente * lo que el OP está buscando. –
Esto proporciona una variable llamada para trabajar con:
foreach $line (<STDIN>) {
chomp($line);
print "$line\n";
}
Para leer un archivo, una conexión en este aspecto:
program.pl < inputfile
+1 para evitar el código abreviado de Perl, muy común, ilegible – MikeKulls
-1, ya que foreach sorberá todo el archivo. Es mejor asignar a la línea en un ciclo while. Además, Perl tiene un comportamiento mágico incorporado para los corchetes angulados desnudos, por lo que debería haber dicho while (my $ line = <>). Entonces no es necesaria una redirección. –
La primera línea debe leer 'foreach my $ line (
El La forma "más hábil" en ciertas situaciones es aprovechar el -n
switch. Envuelve implícitamente su código con un bucle while(<>)
y maneja la entrada de forma 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 comandos:
chmod +x slickestWay.pl
Ahora, dependiendo de su entrada siga uno de los siguientes:
esperar a la entrada del usuario
./slickestWay.pl
Leer de archivo (s) nombrado en argumentos (sin cambio de dirección requiere)
./slickestWay.pl input.txt ./slickestWay.pl input.txt moreInput.txt
uso de una tubería
someOtherScript | ./slickestWay.pl
El bloque BEGIN
es necesario si usted necesita para 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 sus amigos.
Si hay una razón por la que no se puede utilice la solución simple provista por ennuikiller arriba, entonces tendrá que usar Typeglobs para manipular manejadores de archivos. Esto es mucho más trabajo. Este ejemplo copia desde el archivo en $ARGV[0]
al de $ARGV[1]
. Se establece de manera predeterminada en 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($_);
}
+1 por una forma que funcionará si el nombre de archivo para leer desde * no está * en la línea de comandos sino en otro lugar (en alguna variable, lea desde el archivo de configuración, etc.) simplemente reemplace '$ ARGV [0]' etc. con otra variable) donde todas las demás respuestas fallan ... –
O, para leer, simplemente "desplace" el nombre de archivo a '@ ARGV' y use el operador de diamante,' <> '. –
Aquí es cómo hice un script que podría tomar como entradas de línea de comandos o un archivo de texto redirigido.
if ($#ARGV < 1) {
@ARGV =();
@ARGV = <>;
chomp(@ARGV);
}
Este reasignará el contenido del archivo a @ARGV, a partir de ahí sólo @ARGV proceso como si alguien estaba incluyendo opciones de línea de comandos.
ADVERTENCIA
Si se redirige ningún archivo, el programa se sentará a su inactividad, ya que está a la espera para la entrada de STDIN.
No he encontrado una forma de detectar si un archivo está siendo redirigido aún para eliminar el problema STDIN.
Este es un enfoque genial, pero no lo que el OP estaba pidiendo. Esto permite pasar un único nombre de archivo como argumento, cuyo contenido se usa como argumentos de línea de comandos. OP estaba buscando algo diferente. Además, ¿por qué el críptico '$ # ARGV <1' en lugar de (lo que pienso como) es más claro' @ARGV == 1'? –
- 1. Leer desde archivo, o STDIN
- 2. Leer del archivo o stdin
- 3. ¿Puedo solicitar la entrada del usuario después de leer la entrada canalizada en STDIN en Perl?
- 4. ¿Cómo leer desde stdin con fgets()?
- 5. ¿Cómo leer la entrada de STDIN en el ensamblaje x86_64?
- 6. Flushing Perl STDIN buffer
- 7. Erlang leer stdin escribir stdout
- 8. Leer contraseña de stdin
- 9. leer la entrada desde un archivo y sincronizar en consecuencia
- 10. ¿Cómo encauzar entrada a src_block como stdin?
- 11. Perl inicial <STDIN>
- 12. ¿Cómo extraer el archivo tar desde stdin?
- 13. ¿Cómo puedo probar STDIN sin bloquear en Perl?
- 14. Perl, deshabilitar la entrada de amortiguación
- 15. cómo leer desde entrada estándar sin bloqueo?
- 16. Abrir archivo para leer y escribir (no anexar) en perl
- 17. Perl: Pase el manejador de archivo abierto a un programa que lee STDIN
- 18. leer desde la entrada estándar de escritura a la salida estándar en C
- 19. Python: Leer gran cantidad de líneas de stdin
- 20. Cómo leer líneas de stdin (* en *) en clojure
- 21. Cómo leer un archivo (o stdin) línea por línea en Python no esperando la lectura del archivo completo
- 22. ¿Cómo leer y escribir desde una tubería en Perl?
- 23. ¿Cómo leo la entrada de consola/stdin en Dart?
- 24. Escribiendo a stdin desde PHP?
- 25. Cómo usar select() para leer la entrada desde el teclado en C
- 26. ¿Cómo puedo hacer que Perl tome la entrada de STDIN un carácter a la vez?
- 27. R - Leer STDIN línea por línea
- 28. ¿Cómo quitar una copia de un identificador de archivo STDIN?
- 29. leer de la entrada estándar en C++
- 30. lectura() desde la entrada estándar
+1 + nitpick: "leerá de uno o más archivos consecutivamente especificados en la línea de comandos" – msw
... y todo lo que tiene que hacer es escribir '@ARGV =" /path/to/some/file.ext ";' y lee el archivo, por lo que incluso puede programar un archivo predeterminado en determinadas condiciones. – Axeman
Y si su script es muy corto, puede usar las opciones -n o -p para perl, y especificar su procesamiento en la línea de comando: 'perl -n -e '$ _ = uc ($ _); impresión;' yourfile'. Con -p en lugar de -n, perl imprime automáticamente $ _ al final. – mivk