$ref = \%hash;
$ref = \@hash;如何在perl中使用typeglob进行与引用相同的操作?
perl解释$$ref{key}的确切步骤是什么?
发布于 2011-06-28 13:12:38
如果您在问如何获得对类型glob的引用,这只是:
my $ref = \*symbol_name_here;对于符号的“文字名称”(即输入符号的确切名称),而不是变量。但是你可以这样做:
my $ref = Symbol::qualify_to_ref( $symbol_name );一个可变的符号。但是,上面的方法适用于strict,下面的简单方法则不适用于:
my $ref = \*{$symbol_name};Symbol::qualify*的优点之一是,它将包名作为第二个变量处理。所以..。
my $sref = Symbol::qualify_to_ref( $symbol_name, $some_other_package );执行与\*{$some_other_package.'::'.$symbol_name}相同的操作,并与strict一起工作。
一旦您有了符号ref,要获得槽,就必须尊重引用,这样perl就不会像这样尝试使用它作为散列。
my $href = *{ $sref }{HASH};
my $code = *{ $sref }{CODE};
my $arref = *{ $sref }{ARRAY};
my $io = *{ $sref }{IO};再来一次
我用不同的方式把你的两个想法组合在一起。如果您有符号表引用,您可以获得HASH槽,这是一个引用,就像任何其他对哈希的引用一样。这样你就可以做下面的事。
任一
*hash{HASH}->{key}或
${ *hash{HASH} }{key}会起作用的。不过,这些更安全
( *hash{HASH} || {} )->{key};
${ *hash{HASH} || {} }{key};如果不使用直接条目,而是使用表中的引用来执行此操作,则应执行以下操作:
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 (“一些东西”);发布于 2011-06-28 11:51:35
我不认为您可以对type glob执行与引用完全相同的操作(例如,词汇变量从来不涉及类型glob)。你到底想达到什么目的?
至于$$ref{key},perl的进展如下:
{...}指示$ref必须是哈希引用。发布于 2011-06-28 11:51:50
Perl具有惊人的和著名的实验性:
尝试:
perl -MO=Terse -e' $ref = \%hash; $ret = $$ref{key}'或者:
perl -MO=Debug -e' $ref = \%hash; $ret = $$ref{key}'一切都会被揭露。如果您有一个调试Perl,您甚至可以:
perl -Dt -e'$ref = \%hash; $ret = $$ref{key}'https://stackoverflow.com/questions/6505654
复制相似问题