如何使用XML::Parser';从中引用文件名(使用parsefile时);什么是启动处理器?
如果我实例化一个XML::解析器:如何使用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的本质我
$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 ...
...
}