2011-07-05 2 views
2
11 package C; 
12 $_ = 5; 
13 print "$_\n$C::_\n$::_\n"; 

出力:このPerlの解釈のバグですか?

5 

5 

我々は$_はPerlでスーパーグローバル変数であるが、なぜこの変数に最初割り当てが同時に$::_への割り当ての原因になります知っているように?最後print

UPDATE

package C; 
$_ = 5; 
print "$_\n$C::_\n$::_\n"; 
package main; 
print "####in main::\n"; 
$_ = 2; 
print "$_\n$::_\n"; 
package A; 
our $_ = 1; 
$_ = 4; 
print "####in A::\n"; 
print "$_\n$::_\n$A::_\n"; 
print "####in B::\n"; 
package B; 
$_ = 3; 
print "| $_ | \n 
     |$::_ | \n 
     |$B::_\n"; 

、あなたは$_$::_が異なっていることがわかります。

| 3 | 

     |2 | 

     | 
+2

アップデートに関して:私はあなたの問題を再現できません。ここでは、$ _は$ _と全く同じです。どのPerlバージョンを使用していますか? –

+0

これは '5.8.8' ... –

+1

古代版のperlを使うとperl deltasを最初に読んでみることができますhttp://perldoc.perl.org/index-history.html –

答えて

4

$_ = 3;は、$::_ = 3の代わりに$A::_ = 3;のように扱われます。これはバージョン5.8.8のバグです。デバッガで実行

、ライン

our $_ = 1; 

は、デバッガで見ることができるようにパッケージ変数$A::_を作成します。

DB<5> V :: _ 
$_ = 2 
@_ = (
    0 0 
    1 '_' 
    2 *main::_ 
    3 0 
    4 '-1' 
) 

    DB<6> V A:: _ 
$_ = 1 

次の行$_ = 4;$A::_を変更します。

$_ = 3;行を実行すると、パッケージ変数$A::_が設定されます。これもバグです。それは$::_にアクセスする必要があります。これは、その時点でのデバッガ出力です。

DB<7> V :: _ 
$_ = 2 
@_ = (
    0 0 
    1 '_' 
    2 *main::_ 
    3 0 
    4 '-1' 
) 

    DB<8> V A:: _ 
$_ = 3 

これは何が起こっているかを示してくれることを願っています。

5

$_パッケージmainに保たれています。また、パッケージ名を省略すると、mainパッケージとみなされます。つまり、$::_は、$main::_(同様に$main'_)に相当します。

更新について:$_$main::_となっています。しかし、ourの後、$_$A::_になりました。これはPerl 5.8.8のバグです。

+0

それは間違っています。スーパーグローバル '$ _'はどのパッケージにも含まれていません。 –

+0

私はそれを証明するための例を提供しました。 –

+2

あなたは文書を読んだことがありますか? –

2

::fooは、$_という句読点変数が格納されているところには、main::foomain::が含まれています。

3

デフォルトでは、$_$::_の略です。

ただし、更新のコードの一部では、$_という名前のレキシカルを作成することによって、$_の意味を変更しました。このレキシカルはあなたが尋ねている場合に使用されています。

our $xは、「スーパーグローバル」を除き、現在のパッケージの$xに別名を付けた字句変数$xを作成します。"スーパーグローバル"の場合、新しい変数は "スーパーグローバル"にエイリアスされます。

>perl5140 -le"package PA; our $x='A'; package PB; $x='B'; print $PA::x;" 
B 

>perl5140 -le"package PA; our $_='A'; package PB; $_='B'; print $::_;" 
B 

5.8に例外がないようです。

ところで、5.8と5.10が正式に終了したことに気づいていますか?

関連する問題