1

クラスメソッドで指定されたコマンドに応じて返されるさまざまな XML を解析しようとしていますが、ここで少し深くなっていると思います。

他のメソッドを使用して、XML::Twig ハンドラーの WITHIN からインスタンスの属性にアクセスできるようにしたいと考えています。

これは、XML::Twig を使用して XML を取得および解析するために Moose オブジェクトで定義したインスタンス メソッドです。

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...";
    }
}

そして、ハンドラーの1つの定義(これを正しく行う方法を見つけている間、実際には何もしていません:

sub process_symm_info {
    my ($twig, $symminfo) = @_;

    print Dumper($symminfo);

}

これは問題なく機能しますが、私が望むのは、process_symm_infoメソッドが $self にアクセスし、$self がもたらすすべてのメソッドと属性にアクセスできるようにすることです。それは可能ですか?私はこれをすべて間違っていますか?XML の特定の部分を指定できるので、ハンドラー内からそのデータを使用して他のことを実行できると便利です。

これは、Perl Moose への私の最初の冒険のようなものです (まだわからない場合)。

4

1 に答える 1

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!

閉鎖の世界、つまり:)

于 2012-07-30T22:34:16.253 に答える