आप '::' में समाप्त होने वाली कुंजियों को देख सकते हैं, जो इंगित करेंगे कि इसमें अन्य पैकेज हैं, या सभी मान प्रतीक रेफरी हैं।
- बेशक, यहां तक कि यहां एक हैश से छेड़छाड़ करना मुश्किल होगा जो प्रतीकों को संग्रहीत करता है (किसी भी कारण से)। मैं
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::');
}
प्रदर्शन भयानक नहीं था।
मैं इसे 'perl -MDevel :: Peek -e' डंप (\% a: :), डंप (\% ए) ''चलाने से इसे कम करने के लिए शुरू कर रहा था। लिंक के लिए धन्यवाद ताकि मैं कम माल-संवर्धन कर सकूं। एक्सएस के बिना आप अभी भी '$ is_a_symtable = do {$ sv = B :: svref_2object ($ हैशफ) जैसे कुछ कर सकते हैं; रेफरी ($ sv) eq 'B :: HV' && $ sv-> NAME};' – mob