Como posso misturar argumentos de linha de comando e nomes de arquivos para <> em Perl?

StackOverflow https://stackoverflow.com/questions/2344926

  •  23-09-2019
  •  | 
  •  

Pergunta

Considere o seguinte programa bobo Perl:

$firstarg = $ARGV[0];

print $firstarg;

$input = <>;

print $input;

Eu o corro de um terminal como:

perl myprog.pl sample_argument

E receba este erro:

Can't open sample_argument: No such file or directory at myprog.pl line 5.

Alguma idéia de por que isso é? Quando chega ao <> está tentando ler do arquivo (inexistente), "sample_argument" ou algo assim? E porque?

Foi útil?

Solução

<> é abrevante para "ler dos arquivos especificados em @ARGV, ou se @ARGV está vazio, então lido de STDIN". Em seu programa, @ARGV contém o valor ("sample_argument"), e assim Perl tenta ler desse arquivo quando você usa o <> operador.

Você pode consertar isso limpando @ARGV Antes de chegar ao <> linha:

$firstarg = shift @ARGV;
print $firstarg;
$input = <>;       # now @ARGV is empty, so read from STDIN
print $input;

Outras dicas

Veja a página Perlio Man, que lê em parte:

O NULL FileHandle <> é especial: pode ser usado para imitar o comportamento de sed e awk. A entrada de <> vem da entrada padrão ou de cada arquivo listado na linha de comando. Veja como funciona: a primeira vez <> é avaliada, a matriz @Argv será verificada e, se estiver vazio, $ argv [0] será definido como "-", que quando aberto, fornece entrada padrão. A matriz @argv é então processada como uma lista de nomes de arquivos.

Se você quer stdin, use stdin, não <>.

Por padrão, Perl consome os argumentos da linha de comando como arquivos de entrada para <>. Depois de usá -los, você deve consumi -los com eles mesmo com shift;

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top