首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用perl中的类型perl与引用进行相同的操作?

如何使用perl中的类型perl与引用进行相同的操作?
EN

Stack Overflow用户
提问于 2011-06-28 11:24:24
回答 3查看 1.1K关注 0票数 4
代码语言:javascript
复制
$ref = \%hash;
$ref = \@hash;

如何在perl中使用typeglob进行与引用相同的操作?

perl解释$$ref{key}的确切步骤是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-28 13:12:38

如果您在问如何获得对类型glob的引用,这只是:

代码语言:javascript
复制
my $ref = \*symbol_name_here;

对于符号的“文字名称”(即输入符号的确切名称),而不是变量。但是你可以这样做:

代码语言:javascript
复制
my $ref = Symbol::qualify_to_ref( $symbol_name );

一个可变的符号。但是,上面的方法适用于strict,下面的简单方法则不适用于:

代码语言:javascript
复制
my $ref = \*{$symbol_name};

Symbol::qualify*的优点之一是,它将包名作为第二个变量处理。所以..。

代码语言:javascript
复制
my $sref = Symbol::qualify_to_ref( $symbol_name, $some_other_package );

执行与\*{$some_other_package.'::'.$symbol_name}相同的操作,并与strict一起工作。

一旦您有了符号ref,要获得槽,就必须尊重引用,这样perl就不会像这样尝试使用它作为散列。

代码语言:javascript
复制
my $href  = *{ $sref }{HASH};
my $code  = *{ $sref }{CODE};
my $arref = *{ $sref }{ARRAY};
my $io    = *{ $sref }{IO};

再来一次

我用不同的方式把你的两个想法组合在一起。如果您有符号表引用,您可以获得HASH槽,这是一个引用,就像任何其他对哈希的引用一样。这样你就可以做下面的事。

任一

代码语言:javascript
复制
*hash{HASH}->{key}

代码语言:javascript
复制
${ *hash{HASH} }{key}

会起作用的。不过,这些更安全

代码语言:javascript
复制
( *hash{HASH} || {} )->{key};
${ *hash{HASH} || {} }{key};

如果不使用直接条目,而是使用表中的引用来执行此操作,则应执行以下操作:

代码语言:javascript
复制
my $ref   = \*hash;
my $value = *{ $ref }{HASH} && *{ $ref }{HASH}->{key};

注意: %hash绝对需要是一个包变量。只有包变量驻留在符号表中(因此只有子变量、@ISA变量和导出变量在现代符号表中)。词法变量(声明为my)驻留在“垫”中。

更新:

  • 我已经不再使用Symbol了。奇怪的是,尽管它是核心,但在佩勒斯所做的--以及看到--事情上,它似乎是不标准的。相反,我在我所称的“无块”中使用了直接的方式,尽可能地将它们本地化。我只想要一个符号。#关闭严格-裁判关闭,得到它,打开它。我的$symb = do {没有严格的“参考”;\*{$symbol_name};或{没有严格的“参考”;*{$package_name.::‘.$符号_name}= $sub_I_created;.#更鲁莽的符号表……}
  • 我几乎总是使用*STDERR{IO}成语作为glob文件句柄引用。在现代Perl中,这些通常是对象。 我的$fh = *STDERR{IO};说祝福( $fh );# IO::File $fh-> say (“一些东西”);
票数 8
EN

Stack Overflow用户

发布于 2011-06-28 11:51:35

我不认为您可以对type glob执行与引用完全相同的操作(例如,词汇变量从来不涉及类型glob)。你到底想达到什么目的?

至于$$ref{key},perl的进展如下:

  • 第一个$告诉它返回一个标量。
  • 在sigil之后出现的变量表示该变量必须是引用。
  • {...}指示$ref必须是哈希引用。
票数 1
EN

Stack Overflow用户

发布于 2011-06-28 11:51:50

Perl具有惊人的和著名的实验性:

尝试:

代码语言:javascript
复制
 perl -MO=Terse -e' $ref = \%hash; $ret = $$ref{key}'

或者:

代码语言:javascript
复制
 perl -MO=Debug -e' $ref = \%hash; $ret = $$ref{key}'

一切都会被揭露。如果您有一个调试Perl,您甚至可以:

代码语言:javascript
复制
 perl -Dt -e'$ref = \%hash; $ret = $$ref{key}'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6505654

复制
相关文章

相似问题

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