首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >typeglob别名

typeglob别名
EN

Stack Overflow用户
提问于 2012-12-28 21:34:25
回答 4查看 2.2K关注 0票数 4

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

代码语言:javascript
复制
my @a;
my $b=\@a;
#can now reference the same list of scalars from either @$b or @a

但我如何才能反其道而行之?例如:

代码语言:javascript
复制
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"

我假设这将通过typeglobs实现,但我就是想不到它们。想法?

同样,对哈希和数组做同样的事情也很好。

编辑:这似乎是可行的,但它有点笨拙,因为它只是将无名数组元素复制到“别名”,然后将自己重新指向数组:

代码语言:javascript
复制
my @b=@$a;
$a=\@b;

有更好的主意吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-28 22:59:42

三种方式:

  1. 重建别名。

5.22添加了一个实验功能,它完全可以做你想要的事情。

使用实验性的qw(重混叠);\my @B = $A;

5.26添加了第二个实验功能,允许以下功能:

使用实验性的qw(重混叠declared_refs );my \@B = $A;

请注意,作为实验性要素,这些要素随时可能发生更改和移除。

  • 全局别名

Perl将其符号表条目数据结构称为"type glob",或简称为"glob“。可以将此数据结构中的条目设置为引用,以命名该引用。

local our @B;*B = $A;#设置"B",@B的数组插槽。

请注意,我们必须使用包变量,因此变量是全局visible.

  • Data::Alias

别名my @B = @$A;

票数 8
EN

Stack Overflow用户

发布于 2012-12-28 23:32:41

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

  1. 符号表。它是一个全局散列,存储全局variables.
  2. Lexical作用域的记录。它是存储的匿名临时内存,不是特定的符号表,而是附加到程序的一个块上。它们存储我们只能在该程序块中看到的变量。

Typeglobs用于定义记录(变量、数组等)。符号表,但不是词法作用域。所以,当你使用这部分代码时:

代码语言:javascript
复制
my @b;
*b = $a;

你将会得到它:

代码语言:javascript
复制
Name "main::b" used only once:

这告诉我们,我们没有在符号表中定义记录main::b,但是我们可以使用修饰符"our“来定义它。因此,当你这样写的时候:

代码语言:javascript
复制
our @b;
*b = $a;

我们可以得到一个有用的结果,因为*b存储在符号表中,我们可以使用运算符* typeglob。

票数 6
EN

Stack Overflow用户

发布于 2012-12-28 22:43:34

我想我明白了..。

代码语言:javascript
复制
my $a=[1..4];
our @b;
*b=$a;
print "@b\n";
@b=(6..10);
print "@$a\n";

打印:

代码语言:javascript
复制
1 2 3 4
6 7 8 9 10

“我们的”对我来说还有点神秘...我想我还得读点书..。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14070342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档