即使$ var不是带有*twigil 的动态变量,此代码也会打印出“ Duo” :
our $var="Duo";
sub sub1() {
say $*var;
}
sub1();
#output is 'Duo'
Run Code Online (Sandbox Code Playgroud)
unit package ABC;在开始处添加a 会导致编译时错误“找不到动态变量$ * var”:
unit package ABC;
our $var="Duo";
sub sub1() {
say $*var;
}
sub1();
# compile time error
Run Code Online (Sandbox Code Playgroud)
在这种情况下,添加* twigil可使变量可访问。
为什么会有所不同?
编辑1:
无论使用或不使用软件包,使用my代替代替our都是编译时错误,即使按照我的理解,这意味着相同的词法范围。
是旨在动态使用,明确声明为这样的变量(就像我可以找到的所有示例一样)。如果是这样,如何our使以上工作?我糊涂了。
编辑2:
我认为以下内容说明了我为何感到困惑:
our $var="non dynamic"; #1
{say $*var;}
our $*var="dynamic"; #2
{say $*var;}
#With #2 commented output is
#non dynamic
#non dynamic
#
#With #2 in place output becomes
#(Any)
#dynamic
Run Code Online (Sandbox Code Playgroud)
在第一种情况下(注释#2),我动态地(两次)访问一个非动态变量。
在第二种情况下,our $var变量在our $*var声明时变得混乱,访问相同的动态变量将解析为两个单独的变量。
Seems like dynamic variables are looked up in the GLOBAL name space. Thus the following works:
unit package ABC;
$GLOBAL::var="Duo";
sub sub1() {
say $*var;
}
sub1();
#output is 'Duo'
Run Code Online (Sandbox Code Playgroud)
The reason your first example works is that (according to the documentation):
The user's program starts in the
GLOBALpackage, so "our" declarations in the mainline code go into that package by default.
从概念上讲,动态变量查找发生在所有动态范围内。动态范围首先是PROCESS::,然后GLOBAL::是程序具有的任何动态范围。
因此,当您查找动态变量时,它将首先从当前向下查找所有动态范围。如果找不到它,它将在中查找GLOBAL::,如果找不到,则在中查找PROCESS::。
例如,如果要在STDOUT上打印某些内容,它将查找$*OUT动态变量。如果您没有在动态范围中的某处定义一个,它将使用来自PROCESS::以下项的一个:
dd PROCESS::<$OUT>;
# IO::Handle element = IO::Handle.new(path => IO::Special.new("<STDOUT>")...)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |