2010-03-10 50 views

回答

16

通常會將這些標記放入已經過預處理或機械生成的代碼中,以便回溯到人爲生成的來源。

例如,如果有一個程序,轉換Python來Perl中,它可能會插入一個

# line 812 "foo.py" 

,這樣的錯誤信息會指向原始Python代碼這會更有意義程序員。

7

它們在將Perl腳本包裝到另一個文件中時非常有用,就像pl2bat一樣。 Perl在文件的開頭沒有看到批處理命令,它拋出了對行號的想法。 Perl源代碼開頭的#line指令彌補了這一點。

1

除了已經提到的原因,perl有一個(強烈建議)-P選項,該選項在執行前通過C預處理器運行Perl文件。由於大多數C預處理器在包含或刪除文件的一部分時將使用行指令,因此將從它們位於原始源而不是處理源中的位置報告任何錯誤。

如果您在字符串中生成代碼然後傳遞給eval,則行指令也可能非常有用。通常,如果在此類代碼中出現警告或錯誤,則會報告錯誤,例如「在(eval 1)第1行死亡」。使用行指令可以提供有用的文件名和行號。

6

我已經多次看到人們錯誤地將當前行的編號寫入#line指令。它應該包含下一個行號。 linetest.pl的示例代碼(使用KSH包裝來設置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."; 

運行該腳本並檢查結果:

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

你可以看到,行號在第8行寫#line 9後匹配。