1

2 つの 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; 

私は、それが間違っている/正しくないことを知っていますが、制限を使用しているときに、この種のシンボリック ref 変換が必要です。また、 evalでできるかどうかも知りたいと思いました。しかし、特定のハッシュ ( hashInfo )を参照する最後の変数、ここでは $var1 が必要です。

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

一部のコーディング文化では、オフstrictまたはwarnings「不正行為」とみなされることを理解しています。このような小さなブロックで1 つのクラスの警告をオフにすることについて、コード レビューに関する質問があったことは知っています。どの警告が表示されるかはわかっていたので、それは必要ありませんでした。レビュアーはそのようには見ていませんでした。

このため、一部のベテラン Perl ユーザーは、strict をオフにすることについて何も考えていません。しかし、ネイティブが落ち着かなくなるためにできない場合は、を使用できます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 に答える