0

如果我实例化一个 XML::Parser:

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

然后调用 parsefile:

$parser->parsefile($filename);

$filename是否可以从内部检索值start_handler

4

2 回答 2

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);
于 2013-06-03T20:49:46.517 回答
0

解决此问题的一种笨拙方法是将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 ...
...
}
于 2013-06-04T14:54:51.033 回答