Line directives (#line) se utilizan para reconfigurar la idea de Perl del nombre de archivo y número de línea actuales. ¿Cuándo se requiere para obtener el nombre y el número de línea correctos (en un mensaje de error)?¿Cuál es el propósito de las directivas #line de perl?
Respuesta
Por lo general, tales marcadores se ponen en el código que ha sido preprocesado o generado mecánicamente para remitir a la fuente generada por el ser humano.
Por ejemplo, si había un programa que convierte a Python Perl, podría insertar un
# line 812 "foo.py"
para que los mensajes de error se referiría al código Python original que tendría más sentido para el programador.
Son útiles cuando se envuelve una secuencia de comandos de Perl en otro archivo, como hace pl2bat. Perl no ve los comandos de proceso por lotes al comienzo del archivo, lo que descarta su idea de los números de línea. Una directiva #line
al comienzo de la fuente Perl compensa esto.
Además de los motivos ya mencionados perl
tiene una opción (fuertemente desaconsejada) -P
que ejecuta el archivo Perl a través de un preprocesador C antes de que se ejecute. Como la mayoría de los preprocesadores de C usarán directivas de línea cuando incluyan o eliminen parte de un archivo, los errores se informarán desde donde se ubicaron en la fuente original en lugar de la fuente procesada.
Las directivas de línea también pueden ser muy útiles si está generando código en cadenas que luego pasa a eval
. Normalmente, si hay una advertencia o error en dicho código, aparece un error como "murió en (eval 1) línea 1". Al usar directivas de línea, puede proporcionar un nombre de archivo y un número de línea útiles.
He visto varias veces que las personas escriben incorrectamente el número de la línea actual en la directiva #line. Debe contener el siguiente número de línea . código de ejemplo de linetest.pl (utilizando un envoltorio ksh para establecer una variable de entorno para el script de 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.";
ejecutar el script y comprobar el resultado:
$ ./linetest.pl
MY_ENV_VAR is something
This is line 10. at ./linetest.pl line 10.
Se puede ver que los números de línea coinciden después de escribir #line 9
en la línea 8.
- 1. ¿Cuál es el propósito de las categorías de intención?
- 2. ¿Cuál es el propósito de las clases parciales?
- 3. ¿Cuál es el propósito de las vistas en SQL?
- 4. ¿Cuál es el propósito de las interfaces en php?
- 5. Cómo deshabilitar las directivas #line que se escriben en el archivo de salida de generación T4
- 6. ¿Cuál es el propósito de Active Records?
- 7. ¿Cuál es el propósito de 'Class.forName ("MY_JDBC_DRIVER")'?
- 8. ¿Cuál es el propósito de precompiledApp.config?
- 9. ¿Cuál es el propósito de Rake?
- 10. ¿Cuál es el propósito de 'var'?
- 11. ¿Cuál es el propósito de Function.const?
- 12. ¿Cuál es el propósito de Mage_Core_Block_Template_Facade
- 13. ¿Cuál es el propósito de Anorm's Pk?
- 14. ¿Cuál es el propósito de :: en C#?
- 15. ¿cuál es el propósito de glClear (GL_DEPTH_BUFFER_BIT)
- 16. ¿Cuál es el propósito de layout.xml?
- 17. ¿Cuál es el propósito de git-mv?
- 18. ¿Cuál es el propósito de __cxa_pure_virtual?
- 19. ¿Cuál es el propósito de `qt_noop`
- 20. ¿Cuál es el propósito de requestWindowFeature()?
- 21. ¿Cuál es el propósito de JNDI
- 22. ¿Cuál es el propósito de IntentSender?
- 23. ¿Cuál es el propósito de String.IsInterned?
- 24. ¿Cuál es el propósito de utilizar NSOrderedSame?
- 25. ¿Cuál es el propósito de 'n = n'?
- 26. ¿Cuál es el propósito de Membership.ValidateUser()
- 27. ¿Cuál es el propósito de Ext.require
- 28. ¿Cuál es el propósito de config.assets.precompile?
- 29. ¿Cuál es el propósito de Array.GetLowerBound (int)?
- 30. WPF: ¿Cuál es el propósito de App.xaml?
+1. Nunca supimos que esta característica existía. – friedo