'::'로 끝나는 키를 찾을 수 있습니다.이 키는 다른 패키지를 가지고 있거나 모든 값이 기호 심판임을 나타냅니다.
- 물론 여기서도 기호를 저장하는 해시 (해시)를 말할 필요가 없습니다. 나는
B::svref_2object
으로 주위를 샅샅이 조사하고 있었지만, 일반 해시에 저장된 stash의 기호조차도 $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::');
}
이 성능은 끔찍한하지 않았다.
필자는'perl -MDevel :: Peek -e '덤프 (\ % a : :), 덤프 (\ % a)''를 실행하여 이것을 추론하기 시작했습니다. 링크를 가져 주셔서 감사 드리며 적은화물 이송을 할 수 있습니다. XS가 없다면 여전히 $ is_a_symtable = do {$ sv = B :: svref_2object ($ hashref); ref ($ sv) eq 'B :: HV'&& $ sv-> NAME} – mob