Come posso mescolare argomenti della riga di comando e nomi di file per <> in Perl?
Domanda
Si consideri il seguente programma stupido Perl:
$firstarg = $ARGV[0];
print $firstarg;
$input = <>;
print $input;
ho eseguito da un terminale come:
perl myprog.pl sample_argument
E ottenere questo errore:
Can't open sample_argument: No such file or directory at myprog.pl line 5.
Tutte le idee perché questo è? Quando si arriva alla <> Sta cercando di leggere dal file (inesistente), "sample_argument", o qualcosa del genere? E perché?
Soluzione
<>
è l'abbreviazione di "leggere dai file specificati nel @ARGV
, o se @ARGV
è vuota, quindi leggere da STDIN
". Nel programma, @ARGV
contiene il ("sample_argument")
valore, e così Perl tenta di leggere da quel file quando si utilizza l'operatore <>
.
È possibile risolvere il problema deselezionando @ARGV
prima di arrivare alla linea <>
:
$firstarg = shift @ARGV;
print $firstarg;
$input = <>; # now @ARGV is empty, so read from STDIN
print $input;
Altri suggerimenti
Si veda la pagina perlio uomo, che recita in parte:
Il filehandle nullo <> è speciale: può essere utilizzato per emulare il comportamento di sed e awk. Ingresso da <> proviene o dallo standard input, o da ciascun file elencato sulla riga di comando. Ecco come funziona: la prima volta <> viene valutata, la @ARGV matrice è selezionata, e se è vuoto, $ ARGV [0] è impostato su "-", che quando aperto ti dà l'input standard. L'array @ARGV viene quindi elaborato come una lista di i nomi dei file.
Se si desidera STDIN, utilizzare STDIN, non <>
.
Per impostazione predefinita, perl consuma gli argomenti della riga di comando come file di input per <>
. Dopo che li hai utilizzato, si dovrebbe consumare da soli con shift;