لماذا لا يمكن لـ Win32::TieRegistry سرد المفاتيح الفرعية؟
سؤال
باستخدام Cygwin Perl v5.8.8 وWin32::TieRegistry 0.26.
يمكننا الحصول على كائن تجزئة مرتبط لـ HKEY_CURRENT_USER:
$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER"};
print Dumper $Key;'
$VAR1 = bless( {}, 'Win32::TieRegistry' );
وهذا يعمل للمفاتيح الفرعية:
$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper $Key;'
$VAR1 = bless( {}, 'Win32::TieRegistry' );
ويمكننا طباعة المعلومات الخاصة بالمفتاح:
$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper $Key->Information;'
$VAR1 = 'CntSubKeys';
$VAR2 = 48;
$VAR3 = 'MaxSubClassLen';
$VAR4 = 21;
...
ومع ذلك، تشير الوثائق إلى أنه يمكننا إدراج المفاتيح الفرعية ببساطة عن طريق التعامل معها كتجزئة:
$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper keys %$Key; '
لكن المصفوفة فارغة.هل هو مكسور أم أنني أفعل شيئًا خاطئًا؟هل هناك طريقة أخرى لسرد المفاتيح الفرعية؟
هذا لا يعمل أيضًا:
$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper $Key->SubKeyNames;'
Can't use an undefined value as an ARRAY reference at
/usr/lib/perl5/vendor_perl/5.8/cygwin/Win32/TieRegistry.pm line 720.
المحلول
مع الكود الخاص بك:
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper keys %$Key;
أحصل على هذه النتيجة على جهازي (WinXP، ActiveState Perl v5.10.0، Win32-TieRegistry 0.25):
$VAR1 = 'Adobe\\';
...
$VAR101 = 'Classes\\';
$VAR102 = '\\';
وهذا ما أحصل عليه مع نموذج التعليمات البرمجية الثاني الخاص بك:
$VAR1 = 'Adobe';
...
$VAR101 = 'Classes';
لذا فإن كلا نموذجي التعليمات البرمجية الخاصين بك يعملان بشكل جيد، على ActiveState Perl وWindows XP على الأقل.
يحرر:يبدو هذا وكأنه مشكلة/خطأ أكثر عمومية:
- فشلت وحدة TieRegistry في تعداد القيم على Community.activestate.com
- خطأ Win32::TieRegistry (أم أنه أنا؟) على prlmnks.org
- مشاركة مدونة على weblog.siliconcerebrate.com
- يبدو أن الأمر برمته مرتبط بنظام التشغيل Windows Vista
لا تنتمي إلى StackOverflow