如果我实例化XML::Parser:
$parser = new XML::Parser(ErrorContext => 2, Namespaces => 0);
$parser->setHandlers(Start => &start_handler);
然后调用parsefile:
$parser->parsefile($filename);
是否可以从start_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
中(这与gensym的答案类似,但允许递归)。
$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 ...
...
}