لماذا لا يمكن لـ Win32::TieRegistry سرد المفاتيح الفرعية؟

StackOverflow https://stackoverflow.com/questions/678015

  •  21-08-2019
  •  | 
  •  

سؤال

باستخدام 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 على الأقل.

يحرر:يبدو هذا وكأنه مشكلة/خطأ أكثر عمومية:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top