如果我实例化XML :: Parser:
$parser = new XML::Parser(ErrorContext => 2, Namespaces => 0);
$parser->setHandlers(Start => \&start_handler);
然后调用parsefile:
$parser->parsefile($filename);
是否可以从$filename
start_handler
的值
答案 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 ...
...
}