我正在尝试解析根据类方法中给出的命令返回的不同XML ...但我认为我在这里有点深入。
我希望能够使用其他方法并从XML :: Twig处理程序中访问WITHIN实例的属性。
这是我在Moose对象中定义的实例方法,以便使用XML :: Twig获取和解析XML:
sub get_xmls {
my $self = shift;
my $sehost = shift;
my $symm = shift;
$self->log->info("Getting XMLs for $sehost - $symm");
my %SYMMAPI_CALLS = (
"Config" => {
'command' => "symcfg list -sid ${symm} -v",
'handlers' => {
'SymCLI_ML/Symmetrix' => $self->can('process_symm_info')
},
'dbtable' => "inv_emc_array"
},
"Pools" => {
'command' => "symcfg -sid ${symm} list -pool -thin",
'handlers' => {
'DevicePool' => $self->can('process_symm_pool')
},
'dbtable' => "inv_emc_pool"
}
);
foreach my $key (sort(keys %SYMMAPI_CALLS)) {
my $xmldir = $self->xmlDir;
my $table = $SYMMAPI_CALLS{$key}{'tbl'};
my $handlers = $SYMMAPI_CALLS{$key}{'handlers'};
my $command = $SYMMAPI_CALLS{$key}{'command'};
my $xmlfile = qq(${xmldir}/${sehost}/${key}_${symm}.xml);
$self->log->info("\t$key");
if(!-d qq(${xmldir}/${sehost})) {
mkdir(qq(${xmldir}/${sehost}))
or $self->log->logdie("Cant make dir ${xmldir}/${sehost}: $!");
}
$self->_save_symxml($command, $xmlfile);
$self->twig(new XML::Twig( twig_handlers => $handlers ));
$self->log->info("Parsing $xmlfile...");
$self->twig->parsefile($xmlfile);
$self->log->info("\t\t...finished.");
die "Only running the first config case for now...";
}
}
其中一个处理程序的定义(当我弄清楚如何正确执行此操作时,并没有真正做任何事情:
sub process_symm_info {
my ($twig, $symminfo) = @_;
print Dumper($symminfo);
}
这很好用,但我想要的是process_symm_info
方法可以访问$ self以及$ self带来的所有方法和属性。那可能吗?我做错了吗?由于我可以指定XML的特定部分,因此能够在处理程序中对该数据执行其他操作是很好的。
这是我第一次进入Perl Moose(如果你还不知道的话)。
答案 0 :(得分:5)
目前,你有
handlers => {
DevicePool => $self->can('process_symm_pool'),
},
将其更改为
handlers => {
DevicePool => sub { $self->process_symm_pool(@_) },
},
变量$self
将由匿名子捕获。这就是以下工作的原因:
sub make {
my ($s) = @_;
return sub { return $s };
}
my $x = make("Hello, ");
my $y = make("World!\n");
print $x->(), $y->(); # Hello, World!
关闭的世界,即:)