2011-03-25 8 views
10

Tengo un script en Perl que toma dos argumentos de línea de comandos y STDIN¿Pasar los argumentos de la línea de comando así como la entrada de STDIN para el script Perl?

#!/usr/bin/perl -w 
use strict; 
use warnings; 

my $logpath = $ARGV[0]; 
print "logpath : $logpath\n"; 

print "Name : "; 
my $name = <>; 
chomp($name); 
print "my name is $name\n"; 

no se detiene en la entrada de la entrada estándar. Funciona bien para cualquiera de línea de comandos o entrada estándar pero no para ambos.

¿Alguna razón?

+0

Lo siento señor, pero ¿qué es lo que quiere? – orlp

Respuesta

18

Cambio

my $name = <>; 

a

my $name = <STDIN>; 

Si @ARGV no tiene elementos, entonces el operador de diamantes leerá de STDIN pero en su caso ya está de paso argumentos aunque la línea de comandos, @ARGV no lo hará estar vacío Por lo tanto, cuando utiliza el operador de diamante <> para leer el nombre, se leerá la primera línea del archivo cuyo nombre se especifica en la línea de comando.

+0

Gracias amigo ... Funcionó ... No sé por qué esto tiene un problema ... – naveenhegde

+5

Es un problema porque <> lee archivos en @ARGV. Si, en cambio, desea que lea de stdin, debe asegurarse de que @ARGV esté vacío. Una forma alternativa de arreglar su programa es continuar usando <>, pero cambie a: mi $ logpath = shift; para que @ARGV esté vacío. – tadmc

+0

Usar el cambio funcionó para mí, mientras que cambiar <> a no – Colin

Cuestiones relacionadas