如何使用XML :: Parser的START处理程序引用文件名(使用parsefile时)?

时间:2013-06-03 19:09:31

标签: xml perl

如果我实例化XML :: Parser:

$parser = new XML::Parser(ErrorContext => 2, Namespaces => 0);
$parser->setHandlers(Start => \&start_handler);

然后调用parsefile:

$parser->parsefile($filename);

是否可以从$filename

中检索start_handler的值

2 个答案:

答案 0 :(得分:1)

在不知道XML :: Parser的内容的情况下,我的建议是使用闭包:

my $filename = "foo.bar";
my $start_handler = sub { 
    # ues $filename here
};
$parser = new XML::Parser(ErrorContext => 2, Namespaces => 0);
$parser->setHandlers(Start => $start_handler);

答案 1 :(得分:0)

解决这个问题的一种笨拙的方法是将parsefile方法包装在子函数parse_file中(见下文)并将文件名存储在$current_filename中(这类似于{{3 },但容忍递归)。

$parser = new XML::Parser(ErrorContext => 2, Namespaces => 0);
$parser->setHandlers(Start => \&start_handler);

$current_filename = '';
$previous_filename = '';

parse_file($filename);

sub parse_file {
   $previous_filename = $current_filename;
   $current_filename = shift;
   $parser->parsefile($current_filename);
   $current_filename = $previous_filename;
}

sub start_handler { 
...
... $current_filename ...
...
}