2016-10-02 51 views
1

當我們附上該代碼放到括號:爲什麼調試器停止使用`語句?

#!/usr/bin/env perl 

{ 
    use warnings 'void'; 
    1; 
} 

調試器停在use warnings 'void'聲明:

main::(/home/kes/tmp/t3.pl:4):  use warnings 'void'; 
    DB<1> l 1-20 
1 #!/usr/bin/env perl 
2 
3 { 
4==> use warnings 'void'; 
5:  1; 
6 } 
7 

但是,如果我們不這樣做:

#!/usr/bin/env perl 


use warnings 'void'; 
1; 

調試器停止在use warnings 'void'聲明:

main::(/home/kes/tmp/t3.pl:5):  1; 
    DB<1> l 1-20 
1 #!/usr/bin/env perl 
2 
3 
4:  use warnings 'void'; 
5==> 1; 
6 
7 

但是,正如我們所見,line 4仍然標記爲易碎。

這些示例中的差異
以及爲什麼調試器不會停止在line 4

回答

4

use語句從不添加到編譯的程序,因爲它是在編譯時執行的。

$ perl -MO=Concise,-exec -e'use warnings qw(void); f()' 
1 <0> enter 
2 <;> nextstate(main 2 -e:1) v:{ 
3 <0> pushmark s 
4 <#> gv[*f] s/EARLYCV 
5 <1> entersub[t2] vKS/TARG 
6 <@> leave[1 ref] vKP/REFC 
-e syntax OK 

因此,調試器絕不會停止在use語句中。讓我們來看看這兩個程序的編譯形式:

$ perl -MO=Concise 
{ 
    use warnings qw(void); 
    1; 
} 
^D 
6 <@> leave[1 ref] vKP/REFC ->(end) 
1  <0> enter ->2 
2  <;> nextstate(main 1 -:2) v:{ ->3 
5  <2> leaveloop vK/2 ->6 
3  <{> enterloop(next->5 last->5 redo->4) v ->4 
-  <@> lineseq vKP ->5 
4   <;> nextstate(main 3 -:3) v:{ ->5 
-   <0> ex-const v ->- 
- syntax OK 

$ perl -MO=Concise 
use warnings qw(void); 
1; 
^D 
3 <@> leave[1 ref] vKP/REFC ->(end) 
1  <0> enter ->2 
2  <;> nextstate(main 2 -:2) v:{ ->3 
-  <0> ex-const v ->3 
- syntax OK 

nextstate OPS設置運行時警告的行號。 (例如,-:2表示從STDIN中讀取的代碼的第2行)。調試器也正在使用它們來知道哪裏中斷並在當前語句的源文件中找到該行。

第二個片段只有一個運行時語句,因此它有一個調試器停止的單個nextstate操作。

然而,第一個片段有兩個陳述。一個裸圈({ ... })和一個常量。裸循環會創建一個nextstate op,並在{後面的第一個非空白字符的行中,該行恰好是use warnings;。我不確定它爲什麼這樣做。

+0

似乎在perl內部的熱門黑客 –

+1

我不明白。什麼是「熱門黑客」? – ikegami

+0

我想,如果裸循環未創建'nextstate' op,則將使用下一個語句的'nextstate' op,並且調試器不會在'use'語句中停止。 –

相關問題