給定一個小Perl庫:(How)我可以在調用Symbol :: delete_package之後重新創建一個包嗎?
package P;
use strict;
use warnings;
print("Loading P\n");
our $k1 = 'v1';
our $k2 = 'v2';
our $k3 = 'v2';
我試着寫一個程序加載,卸載和重裝包裝,以獲得更好的理解包在Perl是如何工作的:
# main.pl
use strict;
use warnings;
use Symbol qw(delete_package);
# Load module
require "./P.pm";
my @incs = sort keys %INC;
my $numSyms = keys %P::;
print("Includes: @incs\nNumber of symbols: $numSyms\n");
# Unload module & delete package
delete_package('P');
delete $INC{'./P.pm'};
@incs = sort keys %INC;
$numSyms = keys %P::;
print("Includes: @incs\nNumber of symbols: $numSyms\n");
# Load module again
require "./P.pm";
@incs = sort keys %INC;
$numSyms = keys %P::;
print("Includes: @incs\nNumber of symbols: $numSyms\n");
運行此程序打印沿(其中該模塊通過keys %INC
列出可能不同的順序)的路線的東西:
Loading P
Includes: ./P.pm Exporter.pm Symbol.pm strict.pm warnings.pm
Number of symbols: 4
Includes: Exporter.pm Symbol.pm strict.pm warnings.pm
Number of symbols: 0
Loading P
Includes: ./P.pm Exporter.pm Symbol.pm strict.pm warnings.pm
Number of symbols: 0
即似乎重新加載庫的方式按預期工作,但符號表%P::
仍爲空。爲什麼圖書館第二次加載時不會重新填充?我試圖找到一種方法來重新加載模塊,而不使用任何CPAN軟件包。
啊,真有意思!如果我有一個子程序'p'這是目前給予裁判的哈希(即它的調用像'P(\%P::);'),並在內部枚舉的符號,是有辦法內平移裁判'p'到一個字符串,這樣你的任何解決方案都可以使用?或者,我是否需要調整呼叫者,讓他們傳遞一個字符串? –
調整調用者以將引用傳遞給正確的glob。 – ikegami
謝謝;我想我必須閱讀在這種情況下'glob'的含義(我總是隻知道在文件名匹配的情況下)。 –