2016-10-02 6 views
1

我々は、中括弧にこのコードを囲むとき:デバッガがなぜ `use`文で停止するのですか?

#!/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行目を意味します。デバッガーは、これらを使用して、現在のステートメントのソース・ファイル内の行を中断し、見つけ出す場所も知ります。

2番目のスニペットにはランタイムステートメントが1つしかないため、デバッガが停止する1つのnextstate opがあります。

ただし、最初のスニペットには2つのステートメントがあります。ベア・ループ({ ... })、および定数。ベア・ループはnextstateオペレーションを作成し、{に続く最初の空白以外の文字の行を作成します。これはuse warnings;です。なぜそれがこれを行うのか分からない。

+0

perlの内部でホットハックのように見える –

+1

私は分かりません。 「ホットハック」とは何ですか? – ikegami

+0

ベア・ループが 'nextstate'を作成しなかった場合、次のステートメントの' nextstate'が使用され、デバッガは 'use'ステートメントで停止しません。 –

関連する問題