可以将$ self传递给XML :: Twig处理程序吗?

时间:2012-07-30 22:32:29

标签: perl moose xml-twig

我正在尝试解析根据类方法中给出的命令返回的不同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(如果你还不知道的话)。

1 个答案:

答案 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!

关闭的世界,即:)