如何使用XML::Parser';从中引用文件名(使用parsefile时);什么是启动处理器?

如何使用XML::Parser';从中引用文件名(使用parsefile时);什么是启动处理器?,xml,perl,Xml,Perl,如果我实例化一个XML::解析器: $parser = new XML::Parser(ErrorContext => 2, Namespaces => 0); $parser->setHandlers(Start => \&start_handler); 然后调用parsefile: $parser->parsefile($filename); 是否可以从start\u handler中检索$filename的值?而不知道XML::Parser的本质我

如果我实例化一个XML::解析器:

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

$parser->parsefile($filename);

是否可以从
start\u handler
中检索
$filename
的值?

而不知道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);

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


这对我来说不太管用,因为parsefile是递归调用的,但非常接近。谢谢
$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 ...
...
}