好的,所以创建对数组的引用很容易......
my @a;
my $b=\@a;
#can now reference the same list of scalars from either @$b or @a
Run Code Online (Sandbox Code Playgroud)
但是我怎么能这样做呢?例如:
my $a=[1..4];
my @b;
#some magic happens here and now @b is an alias for @$a
@b=(6..10);
print "@$a\n"; #should print "6 7 8 9 10"
Run Code Online (Sandbox Code Playgroud)
我认为这会通过typeglobs发生,但那些只是躲避我.想法?
对哈希和数组做同样的事情也会很好.
编辑:这似乎工作,但它有点kludgy因为它只是将anon数组元素复制到"别名",然后重新指向数组:
my @b=@$a;
$a=\@b;
Run Code Online (Sandbox Code Playgroud)
有更好的想法吗?
两种方式:
全球别名
Perl调用"type glob"或简称"glob",它的符号表条目数据结构.可以将此数据结构中的条目设置为对该引用的名称的引用.
use experimental qw( refaliasing );
\my @B = $A;
Run Code Online (Sandbox Code Playgroud)
请注意,通常要求Perl禁止我们使用包变量(通过使用__CODE__).你可以使用它来解决这个问题
__CODE____CODE__
use experimental qw( refaliasing declared_refs );
my \@B = $A;
Run Code Online (Sandbox Code Playgroud)perl程序中的所有变量都存储在名称空间中。命名空间有两种:
Typeglob用于定义Symbol表的记录(变量,数组等),而不是Lexical范围。因此,当您使用这部分代码时:
my @b;
*b = $a;
Run Code Online (Sandbox Code Playgroud)
你会得到的:
Name "main::b" used only once:
Run Code Online (Sandbox Code Playgroud)
这说明我们不是在符号表中定义main :: b记录,但可以使用修饰符“ our ”来完成。因此,当您这样编写时:
our @b;
*b = $a;
Run Code Online (Sandbox Code Playgroud)
我们可以得到有用的结果,因为* b存储在Symbol表中,并且我们可以使用运算符* typeglob。