4

Perl で、コード内で使用するモジュールに新しい名前を割り当てることは可能ですか?

私の目的は: 私のクライアントの一部は .xls ファイル (Spreadsheet::Excel) を必要とし、他のクライアントは .xlsx (Excel::Writer::XLSX) を必要としています。両方のモジュールがほとんどの API を共有しているため、プロジェクトの開始時にそのオプションを一度設定して、後で忘れないようにしたいと考えています。これにより、将来変更することも簡単になります。おそらく、マウス/ムースの変更などにも使用できます。

4

2 に答える 2

6

クラスのパッケージ stash を新しい名前にエイリアスできます。

use strict; use warnings; use feature 'say';

package Foo;
sub new { bless [] => shift }
sub hi  { say "hi from Foo" }

package main;

# Alias the package to a new name:
local *F:: = *Foo::;  # it could make sense to drop the "local"

# make an objects
my $f = F->new;

# say hi!
say $f;
$f->hi;

出力:

Foo=ARRAY(0x9fa877c)
hi from Foo

別の解決策は、必要なパッケージを動的にサブクラス化することです。

use strict; use warnings; use feature 'say';

package Foo;
sub new { bless [] => shift }
sub hi  { say "hi from Foo" }

package Whatever;
# no contents

package main;

# let Whatever inherit from Foo:
# note that I assign, instead of `push` or `unshift` to guarantee single inheritance
@Whatever::ISA = 'Foo'; 

# make an objects
my $w = Whatever->new;

# say hi!
say $w;
$w->hi;

出力:

Whatever=ARRAY(0x9740758)
hi from Foo

これらのソリューションはどちらも実行時に機能し、非常に柔軟です。2 番目の解決策は、より少ない魔法に依存しており、よりクリーンに見えます。ただし、モジュールref($obj) eq 'Foo'が正しい の代わりにテストblessed $obj and $obj->isa('Foo')する可能性があり、破損の原因となる可能性があります。

于 2013-08-31T12:55:11.677 に答える