Come posso mescolare argomenti della riga di comando e nomi di file per <> in Perl?

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

  •  23-09-2019
  •  | 
  •  

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é?

È stato utile?

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;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top