【问题标题】:How to replace package name with a variable when using strictures使用限制时如何用变量替换包名称
【发布时间】:2011-09-02 13:54:31
【问题描述】:

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

【问题讨论】:

  • 想要这个并不是“错误的”。但是,我想知道你想用它做什么。你能解释一下吗?

标签: perl perl-hash


【解决方案1】:

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

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 ) };

但是在非常紧的do 中关闭strict 也同样容易;

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

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

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

【讨论】:

  • @Gaurab Banerjee,不,不是。它是核心perldoc.perl.org/index-modules-S.html 只要我记得,它就是 beeen 核心。如果你有一个没有Symbol 的 perl 安装,那么你真的没有 Perl。
  • @Gaurab:帮什么忙?你还没有解释你想要做什么。当您想访问包符号表时,关闭严格没有错;这比直接操纵藏匿处要明智得多。从 Perl 5.000 模块Symbol开始使用标准并没有错。
  • qualify_to_ref 是在 5.004 中添加的,所以才存在 14 年
【解决方案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'} };

【讨论】:

  • +1 表示软件工程答案与 Perly hack(对 Axeman 没有冒犯 :)
  • 感谢大家的宝贵回复。
猜你喜欢
  • 1970-01-01
  • 2013-06-19
  • 2020-03-23
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多