1

我有两个 Perl 包:pack_hash 和 pack_run

package pack_hash;

$VERSION    = '1.00';
@ISA        = qw( Exporter );
@EXPORT_OK  = qw( %hashInfo );

$hashInfo{abc} = ['a', 'b', 'c'];

1;

package pack_run;

use stricts;
use warnings;
use Data::Dumper;
use  pack_hash qw( %hashInfo );

somethingDoing();

sub somethingDoing {
    my $var1 = \%pack_hash::hashInfo;   # getting the hash reference
    print Dumper($var1);
    ...
    ...
}

1;

谁能告诉我,是否可以通过使用任何变量来替换散列包( pack_hash )的名称,例如:

my $pakVar = "pack_hash";
my $var1 = \%$pakVar::hashInfo; 

我知道它是 WRONG/NOT_CORRECT,但是当我使用限制时,我想要这种符号 ref 转换。我也想知道,是否可以用eval来做这件事。但我想要一个最终变量,这里是 $var1,它将引用特定的哈希(hashInfo);

4

2 回答 2

3

不,那是不可能的。但这是:

use strict;
use warnings;
use Symbol qw<qualify_to_ref>;

my $pakVar = 'pack_hash';
my $var1   = *{ qualify_to_ref( 'hashInfo', $pakVar ) }{HASH};

qualify_to_ref获取包变量的名称和包名称并返回一个GLOB引用指针,然后您只需访问 GLOB 的 HASH 槽。你也可以这样做:

my $var1 = \%{ qualify_to_ref( 'hashInfo', $pakVar ) };

strict但它也很容易在非常紧的情况下关闭do

my $var1
    = do {
        no strict;
        \%{ $pakVar . '::hashInfo' };
   };

我知道一些编码文化认为关闭strictwarnings“作弊”。我知道我有关于在这样的小块中关闭一类警告的代码审查问题。我知道我会收到哪些警告,所以我不需要它。审稿人不这么看。

出于这个原因,一些资深的 Perl-ers 对关闭严格没有任何想法。但是如果你不能因为它让当地人不安——你可以使用Symbol. 然而,一些商店有针对包变量的规则,所以它永远不会成为问题。

于 2011-09-02T14:00:26.570 回答
2

如果您有一个返回对哈希的引用的类方法:

package pack_hash;
use strict;
use warnings;
our %hashInfo;
$hashInfo{abc} = ['a', 'b', 'c'];
sub hashInfo { \%hashInfo }

那么您可以轻松获得参考:

use strict;
use warnings;
my $pakVar = 'pack_hash';
my $hashInfo = $pakVar->hashInfo();
print @{ $hashInfo->{'abc'} };
于 2011-09-02T17:20:12.073 回答