简体   繁体   English

如何从另一个包perl访问我的%hash中的元素值

[英]How to access element value in my %hash from an another package perl

I have a hash inside a package name: ./lib.pm 我在包名称中有一个哈希: ./lib.pm

#!/usr/bin/perl -w
use strict;
use warnings;

package lib;

#my %hash = (
our %hash = (
    Addr =>
    {
        'aa' => 0x11223344,
        'bb' => 0x55667788,
        'cc' => 0xaabbccdd,
    },
);

And i tried to access all of their elements from another package with some ways as below: ./check.pm 而且我尝试通过以下方式从另一个包访问其所有元素: ./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");

And i got result normally: 而且我正常得到结果:

========================
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

But when i change the way of hash declaration from " our %hash " to " my %hash ", the result is gone: 但是,当我将哈希声明的方式从“ 我们的%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

Is there any change i need when getting data from "my %hash"? 从“我的%hash”获取数据时,我需要进行任何更改吗?

my declares a lexical variable, and you can't extend the scope of a lexical variable, ie share it outside the package. 声明了一个词法变量,您不能扩展词法变量的范围,即在程序包之外共享它。

Why can't you use an our variable? 您为什么不能使用我们的变量?

You can't share the lexical variable, but you can share its value. 您不能共享词汇变量,但是可以共享其值。 For example, you can provide a closure in the package that exposes the value: 例如,您可以在包中提供一个闭包来公开该值:

#!/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM