使用strictures时如何用变量替换包名

时间:2011-09-02 13:54:31

标签: perl perl-hash

我有两个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; 

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

2 个答案:

答案 0 :(得分: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。但是,有些商店有反对包变量的规则,因此它永远不会成为问题。

答案 1 :(得分: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'} };