这是Perl在解释中的错误吗?

时间:2011-07-05 08:43:22

标签: perl variables

 11 package C;
 12 $_ = 5;
 13 print "$_\n$C::_\n$::_\n";

输出:

5

5

我们知道$_是Perl中的一个超级全局变量,但为什么第一次赋值给这个变量会导致同时分配给$::_

更新

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";

在上一个print中,您可以看到$_$::_不同。

| 3 |

        |2 |

        |

4 个答案:

答案 0 :(得分:5)

$_保留在main包中。此外,如果省略包名,则假定为main包。也就是说,$::_相当于$main::_(以及$main'_)。

关于您的更新:$_应该是$main::_。但在our之后,$_正在查看$A::_。这似乎是Perl 5.8.8中的一个错误。

答案 1 :(得分:4)

$_ = 3;行被视为$A::_ = 3;而不是$::_ = 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

我希望这能说明发生了什么。

答案 2 :(得分: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正式结束了?

答案 3 :(得分:2)

::foo相当于main::foomain::是存储标点变量$_的地方。