有没有办法判断哈希引用是否指的是符号表?
也就是说,这个功能怎么可能
sub foo {
my ($hashref) = @_;
...
}
知道它是否被调用为
foo( \%main:: )
而不是
foo( \%main )
?
应用程序有时是一种功能 tie
的哈希变量,但我想避免尝试绑定一个符号表。
有没有办法判断哈希引用是否指的是符号表?
也就是说,这个功能怎么可能
sub foo {
my ($hashref) = @_;
...
}
知道它是否被调用为
foo( \%main:: )
而不是
foo( \%main )
?
应用程序有时是一种功能 tie
的哈希变量,但我想避免尝试绑定一个符号表。
看起来这可以通过C API来完成 HvNAME
。以下是来自 负责填实perlapi:
HvNAME
返回存储的包名称, 如果存储不是存储,则为NULL。看到 SvSTASH,CvSTASH。
- char * HvNAME(HV *藏匿处)
看起来这可以通过C API来完成 HvNAME
。以下是来自 负责填实perlapi:
HvNAME
返回存储的包名称, 如果存储不是存储,则为NULL。看到 SvSTASH,CvSTASH。
- char * HvNAME(HV *藏匿处)
您可以查找以“::”结尾的键,这表示它有其他包,或者所有值都是符号引用。
B::svref_2object
,但即使是存储在常规哈希中的存储的符号也会返回 $sym->can( 'STASH' )
。我认为您可能会做的事情是通过符号表下降并查看存储是否指向完全相同的内存位置。
有点像这样:
use Scalar::Util qw<refaddr>;
my %seen;
sub _descend_symtable {
$calls++;
my ( $cand, $stash_name ) = @_;
my $stash = do { no strict 'refs'; \%{ $stash_name }; };
return if $seen{ refaddr( $stash ) }++;
return $stash_name if $cand == $stash;
my $result;
foreach my $s ( grep { m/::$/ } keys %$stash ) {
$result = _descend_symtable( $cand, "$stash_name$s" )
and return $result;
}
return;
}
sub find_in_symtable {
my $needle = shift;
%seen = ();
return _descend_symtable( $needle, 'main::' );
}
表现不是 可怕。