如果我实例化一个 XML::Parser:
$parser = new XML::Parser(ErrorContext => 2, Namespaces => 0);
$parser->setHandlers(Start => \&start_handler);
然后调用 parsefile:
$parser->parsefile($filename);
$filename
是否可以从内部检索值start_handler
?
在不了解 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
(见下文)并将文件名存储在 a 中$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 ...
...
}