2010-03-10 10 views

Respuesta

16

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.

7

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.

1

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.

6

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.

Cuestiones relacionadas