![](/img/trans.png)
[英]Perl How to access a hash that is the element of an array that is the value of another hash?
[英]How to access element value in my %hash from an another package perl
我在包名称中有一个哈希: ./lib.pm
#!/usr/bin/perl -w
use strict;
use warnings;
package lib;
#my %hash = (
our %hash = (
Addr =>
{
'aa' => 0x11223344,
'bb' => 0x55667788,
'cc' => 0xaabbccdd,
},
);
而且我尝试通过以下方式从另一个包访问其所有元素: ./check.pm
#!/usr/bin/perl -w
use strict;
use warnings;
use Cwd;
my $dir = getcwd;
unshift( @INC, $dir );
require lib;
print "========================\n";
print "1: $lib::hash{Addr}{'aa'}\n";
print "2: $lib::hash{Addr}{'bb'}\n";
print "3: $lib::hash{Addr}{'cc'}\n";
print "========================\n";
printf (sprintf("%8X\n", $lib::hash{Addr}{aa}));
printf (sprintf("%8X\n", $lib::hash{Addr}{bb}));
printf (sprintf("%8X\n", $lib::hash{Addr}{cc}));
print "========================\n";
my ($Address_a, $Address_b, $Address_c);
my (@Address_a, @Address_b, @Address_c, @names);
$Address_a = sprintf("%8X", $lib::hash{Addr}{'aa'});
$Address_b = sprintf("%8X", $lib::hash{Addr}{'bb'});
$Address_c = sprintf("%8X", $lib::hash{Addr}{'cc'});
@Address_a = ( $Address_a =~ m/../g );
@Address_b = ( $Address_b =~ m/../g );
@Address_c = unpack("(A2)*", $Address_c);
printf "========================\n";
printf ("@Address_a \t\n");
printf ("@Address_b \t\n");
printf ("@Address_c \t\n");
printf "========================\n";
printf ("$Address_a[0], $Address_a[1], $Address_a[2], $Address_a[3]\n");
printf ("$Address_b[0], $Address_b[1], $Address_b[2], $Address_b[3]\n");
printf ("$Address_c[0], $Address_c[1], $Address_c[2], $Address_c[3]\n");
而且我正常得到结果:
========================
1: 287454020
2: 1432778632
3: 2864434397
========================
11223344
55667788
AABBCCDD
========================
========================
11 22 33 44
55 66 77 88
AA BB CC DD
========================
11, 22, 33, 44
55, 66, 77, 88
AA, BB, CC, DD
但是,当我将哈希声明的方式从“ 我们的%hash ”更改为“ 我的%hash ”时,结果消失了:
========================
Use of uninitialized value in concatenation (.) or string at ./check.pm line 10.
1:
Use of uninitialized value in concatenation (.) or string at ./check.pm line 11.
2:
Use of uninitialized value in concatenation (.) or string at ./check.pm line 12.
3:
========================
Use of uninitialized value in sprintf at ./check.pm line 14.
0
Use of uninitialized value in sprintf at ./check.pm line 15.
0
Use of uninitialized value in sprintf at ./check.pm line 16.
0
========================
Use of uninitialized value in sprintf at ./check.pm line 20.
Use of uninitialized value in sprintf at ./check.pm line 21.
Use of uninitialized value in sprintf at ./check.pm line 22.
========================
0
0
0
========================
, , , 0
, , , 0
, , , 0
从“我的%hash”获取数据时,我需要进行任何更改吗?
我声明了一个词法变量,您不能扩展词法变量的范围,即在程序包之外共享它。
您为什么不能使用我们的变量?
您不能共享词汇变量,但是可以共享其值。 例如,您可以在包中提供一个闭包来公开该值:
#!/usr/bin/perl
use warnings;
use strict;
{ package MyLib;
my %hash = (
Addr => {
aa => 0x11223344,
bb => 0x55667788,
cc => 0xaabbccdd,
},
);
sub get_hash { %hash }
}
my %hash = MyLib::get_hash();
print "========================\n";
print "1: $hash{Addr}{'aa'}\n";
print "2: $hash{Addr}{'bb'}\n";
print "3: $hash{Addr}{'cc'}\n";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.