2010-03-10 17 views

risposta

16

Di solito tali marcatori sono messi in codice che è stato pre-elaborato o generato meccanicamente per fare riferimento alla fonte generata dall'uomo.

Ad esempio, se ci fosse un programma che converte Python per Perl, potrebbe inserire un

# line 812 "foo.py" 

in modo che i messaggi di errore sarebbe fare riferimento al codice Python originale che avrebbe più senso al programmatore.

7

Sono utili quando si esegue il wrapping di uno script Perl in un altro file, come fa pl2bat. Perl non vede i comandi batch all'inizio del file che eliminano l'idea dei numeri di riga. Una direttiva #line all'inizio dell'origine Perl compensa ciò.

1

Oltre ai motivi già citati perl ha un (fortemente sconsigliato) -P opzione che viene eseguito il file Perl attraverso un preprocessore C prima che venga eseguito. Poiché la maggior parte dei preprocessori C utilizzerà le direttive di riga quando includono o rimuovono parte di un file, quindi verranno segnalati eventuali errori da dove si trovavano nella fonte originale anziché dalla fonte elaborata.

Le direttive di linea possono anche essere molto utili se si genera codice in stringhe che viene quindi passato a eval. Normalmente se c'è un avviso o un errore in tale codice si ottiene un errore segnalato come "morto a (eval 1) linea 1." Utilizzando le direttive di linea è possibile fornire un nome file e un numero di riga utili.

6

ho visto più volte che le persone in modo non corretto scrivere il numero della linea corrente nella direttiva #line. Dovrebbe contenere lo successivo numero di riga. Esempio di codice di linetest.pl (usando un wrapper ksh per impostare una variabile di ambiente per lo script perl):

1 #!/usr/bin/ksh 
2 MY_ENV_VAR='something' 
3 export MY_ENV_VAR 
4 /usr/bin/perl -x $0 [email protected] 2>&1 
5 exit $? 
6 
7 #!/usr/bin/perl 
8 #line 9 
9 print "MY_ENV_VAR is $ENV{MY_ENV_VAR}\n"; 
10 die "This is line 10."; 

eseguire lo script e controllare il risultato:

$ ./linetest.pl 
MY_ENV_VAR is something 
This is line 10. at ./linetest.pl line 10. 

si può vedere che i numeri di riga sono corrispondenti dopo la scrittura #line 9 sulla linea 8.