typeglob别名

msw*_*erg 3 perl

好的,所以创建对数组的引用很容易......

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)

有更好的想法吗?

ike*_*ami 8

两种方式:

  1. 全球别名

    Perl调用"type glob"或简称"glob",它的符号表条目数据结构.可以将此数据结构中的条目设置为对该引用的名称的引用.

    use experimental qw( refaliasing );
    \my @B = $A;
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,通常要求Perl禁止我们使用包变量(通过使用__CODE__).你可以使用它来解决这个问题

    1. __CODE__
    2. __CODE__

  2. 数据::别名

    use experimental qw( refaliasing declared_refs );
    my \@B = $A;
    
    Run Code Online (Sandbox Code Playgroud)


ede*_*dem 6

perl程序中的所有变量都存储在名称空间中。命名空间有两种:

  1. 符号表。它是一个全局哈希,用于存储全局变量的记录。
  2. 词汇范围。它是存储的匿名临时存储器,不是特殊的符号表,而是附加在程序块中的。它们存储只能在该程序块中看到的变量。

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。