Como posso misturar argumentos de linha de comando e nomes de arquivos para <> em Perl?
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?
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;