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 |
|
答案 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::foo
,main::
是存储标点变量$_
的地方。