gpt4 book ai didi

perl: "unincluding"模块

转载 作者:行者123 更新时间:2023-12-02 14:18:33 24 4
gpt4 key购买 nike

所以,我有一个这样的程序:

#!/usr/bin/perl -w  
use strict;
foreach (@data) {
if($_ eq "foo") {
use Foo;
process();
}
if($_ eq "bar") {
use Bar;
process();
}
...
}

每个包含的模块都有些相似,唯一的区别是 process()-sub 的作用。

#!/usr/bin/perl -w  
use strict;
sub process {
...
}

我的问题:主脚本的输入是一个(可能很长)事物列表,在处理该列表时,我得到连续的“子例程重新定义”错误(显然)。有什么方法可以“取消使用”模块吗?
由于 future 可能包含的“操作”库可能会增长,我认为这种动态包含模块的方式将是最好的方法。非常感谢您的帮助:)

最佳答案

正如 @pilcrow 所说,您可以通过使用 require 而不是 use 来快速解决这个问题,但是,我认为这是一个很好的例子,其中 Polymorphism是要使用的。

您可以创建一个基类,例如:

package Processors::Base;

sub new{
my $class = shift;
return bless {}, $class;
}

sub process{
die "You can only use a subclass of me";
}

1;

然后,将您的处理器创建为从该基础包继承的包。

package Processors::Foo;

sub process{
... do stuff ...
}

1;

那么你的代码可能如下所示:

#!/usr/bin/perl -w  
use strict;
for my $pkg (@data) {
(my $path = $pkg) =~ s{::}{/}g;
require "$path.pm";
$pkg->process;
...
}

当然,修改假设$_采用Processors::Foo的形式。即使您无法修改 @data 的内容,我认为您也可以生成处理器的名称,以便能够调用其 process() 方法。

如果你想炫耀,你可以创建一个 Factory对象将根据 $_ 的值返回处理器的实例:

package Processors::Factory;

sub get_instance{
my ($self, $processor_name) = @_;

my $full_processor_name = sprintf('Processors::%s', ucfirst($processor_name) );

(my $full_processor_path = $full_processor_pkg) =~ s{::}{/}g;
require "$full_processor_path.pm";

my $processor = $full_processor_name->new();

return $processor;
}

1;

然后,您的代码将如下所示:

#!/usr/bin/perl -w  
use strict;
use Processors::Factory;

foreach (@data) {
Processors::Factory->get_instance( $_ )->process();
...
}

关于perl: "unincluding"模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com