Line directives (#line) sono utilizzati per riconfigurare l'idea di perl del nome file corrente e del numero di riga. Quando è necessario per ottenere il nome file e il numero di riga corretti (in un messaggio di errore)?Qual è lo scopo delle direttive #line di perl?
risposta
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.
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ò.
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.
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.
- 1. Qual è lo scopo delle classi astratte?
- 2. Qual è lo scopo di $ 1 a $ 9 in Perl?
- 3. Qual è lo scopo di. * \\?
- 4. Qual è lo scopo delle raccolte di grafici in TensorFlow?
- 5. Qual è lo scopo delle API di destinazione e minSDK
- 6. Qual è lo scopo di @EnableTransactionManagement?
- 7. Qual è lo scopo delle viste in SQL?
- 8. Qual è lo scopo delle "Prenotazioni" in Amazon EC2
- 9. Qual è lo scopo delle relazioni del pacchetto in .NET?
- 10. Qual è lo scopo delle diverse proprietà * Target?
- 11. Qual è lo scopo della struttura delle bandiere in iOS?
- 12. Qual è lo scopo dell'hash MD5 nel download delle app?
- 13. Qual è lo scopo di Array.GetLowerBound (int)?
- 14. Qual è lo scopo di :: in C#?
- 15. Qual è lo scopo di IAsyncStateMachine.SetStateMachine?
- 16. Qual è lo scopo di riutilizzareIdentificatore?
- 17. Qual è lo scopo di IntentSender?
- 18. Qual è lo scopo di .git/log
- 19. Qual è lo scopo di angular-sanitize?
- 20. Qual è lo scopo di com.sun.org.apache.xpath.internal.operations.String?
- 21. Qual è lo scopo di java.math.MutableBigInteger?
- 22. Qual è lo scopo di $ eq
- 23. Qual è lo scopo di HttpHeaders.TryAddWithoutValidation?
- 24. Qual è lo scopo di Microsoft.Net.Compilers?
- 25. Qual è lo scopo di requestWindowFeature()?
- 26. Qual è lo scopo dell'uso di CommandType.Tabledirect
- 27. Qual è lo scopo di IApplicationBuilder.New()
- 28. Qual è lo scopo di clojure.core.reducers/reduce?
- 29. Qual è lo scopo di partitioningBy
- 30. Qual è lo scopo di durandal?
+1. Non sapevo nemmeno che esistesse questa caratteristica. – friedo