【发布时间】:2017-10-23 02:05:02
【问题描述】:
我基本上是模块的新手,我正在尝试在我的脚本中使用它们。 我很难找到正确使用它们的正确方法,我希望得到您的建议。
让我快速解释一下我要做什么:
我的脚本正在根据 XML 文件中的数据进行一些文件传输。
所以基本上,我有这样内容的 XML 文件:
<fftg>
<actions>
<!-- Rename file(s) -->
<rename>
<mandatory>0</mandatory>
<file name="foo" to="bar" />
</rename>
<!-- Transfer file(s) -->
<transfer>
<mandatory>0</mandatory>
<protocol>SFTP</protocol>
<server>fqdn</server>
<port>22</port>
<file name="bar" remotefolder="toto" />
</transfer>
<!-- Transfer file(s) -->
<transfer>
<mandatory>0</mandatory>
<protocol>SFTP</protocol>
<server>fqdn</server>
<port>22</port>
<file name="blabla" remotefolder="xxxx" />
<file name="blabla2" remotefolder="xxxx" />
</transfer>
</actions>
</fftg>
简而言之,我有一个执行“动作”的脚本。 每个动作都可以重复 X 次。
现在,与其拥有一个包含一堆子例程等的重要脚本。我认为为我的应用程序创建模块并将操作放入模块中应该会更好。
例如:
FFTG::Rename
FFTG::Transfer
FFTG::Transfer::SFTP
FFTG::Transfer::FTP
& 等等(我已经创建了所有这些模块,它们可以独立工作)
并根据 XML 文件中指定的操作调用这些模块。 如果需要,人们可以创建新的模块/操作(我希望事情是模块化的)。
现在,我不知道如何正确地做到这一点。
所以我的问题是:请问最好的方法是什么?
目前,我的脚本正在读取这些操作:
# Load XML file
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($FFTG_TSF . "/" . $tid . ".xml");
# Browse XML file
foreach my $transfer ($doc->findnodes('/fftg')) {
# Grab generic information
my($env) = $transfer->findnodes('./environment');
my($desc) = $transfer->findnodes('./description');
my($user) = $transfer->findnodes('./user');
print $env->to_literal, "\n";
# Browse Actions
foreach my $action ($doc->findnodes('/fftg/actions/*')) {
my $actiontype = ucfirst($action->nodeName());
# how do i select a module from the $actiontype here ? ($actiontype = Rename or Transfer)
# i can't do : use FFTG::$actiontype::execaction(); or something for example, it doesnt work
# and is it the right way of doing it ?
}
}
但也许这不是正确的思考方式。 (我正在使用 Lib::LibXML) 我如何“动态”调用模块(例如在名称中使用变量,例如 FFTG::$actiontype 而且,这是否意味着我必须在每个模块中都有相同的子程序? 示例:子执行
因为我想向模块发送不同的数据......
任何提示? 再次感谢 问候,
【问题讨论】:
-
模块是面向对象的吗?它中是否总是有相同的功能,例如
do或execute或run或类似的东西?能否请edit 提供一个示例模块? -
这是一个很好的问题,这就是我最后要问的问题,我应该创建 OO 模块还是常规模块,我应该在每个模块中使用相同类型的子例程? (否则很难自动调用模块,因为每个模块都在做不同的事情)。我可以编辑我的帖子并发布一个模块,但它不是一个动作模块
-
定义接口很重要。我要写一个答案,但可能需要一段时间,因为它可能很长。
-
啊,这很有趣,再次感谢您的帮助。我想我可以像你说的那样创建一个带有 execute() 子例程的 OO 模块,但是我必须将所有参数传递给它,或者找到一种从模块和每个模块中读取 XML 的方法
标签: xml perl module libxml2 xml-libxml