【问题标题】:Debugging perl script调试 perl 脚本
【发布时间】:2012-02-19 02:51:40
【问题描述】:

我不知道 perl,但我需要调试我正在使用的应用程序所需的 perl 脚本,这是我得到的错误:

Unable to recognise encoding of this document at /usr/lib/perl5/vendor_perl/5.8.8/XML/SAX/PurePerl/EncodingDetect.pm line 9

问题是,这个脚本无法弄清楚文件的编码是什么。我想知道的是,那是哪个文件。我无法找到堆栈跟踪的方法。这是稍微修整的脚本:

package XML::SAX::PurePerl; # NB, not ::EncodingDetect!

use strict;

sub encoding_detect {
    my ($parser, $reader) = @_;

    my $error = "Invalid byte sequence at start of file";
    my $data = $reader->data;
    if ($data =~ /^\x00\x00\xFE\xFF/) {
        # BO-UCS4-be
        $reader->move_along(4);
        $reader->set_encoding('UCS-4BE');
        return;
    } .. tons of if else statements

    warn("Unable to recognise encoding of this document");
    return;

我检查过,但这个阅读器对象没有名称或路径属性。我可以控制这个脚本,所以我可以在必要时对其进行修改。任何帮助表示赞赏。

编辑:我已经找到了问题,直到我尝试使用的应用程序中的这一行:

my @array = SystemImager::HostRange::expand_groups($clients);

【问题讨论】:

  • 该错误表明输入的 XML 文档未声明编码并且文件的前几个字节似乎不是 UTF-8 或 UTF-16。文件可能是空的吗?
  • 我希望在解析器对象中而不是在阅读器中找到文件名。另一种方法可能是在代码中查看 parse_uri 之类的内容。

标签: perl debugging encoding sax


【解决方案1】:

如果你使用Carp 模块和confess 方法,你会得到一个堆栈回溯:

use Carp;

confess "Something went horribly wrong" if ($something == $wrong);

这在函数内部(在模块中)最有用,但它有帮助。但是,听起来好像您正在使用的代码正在报告错误,因此您可能无法将其发送到 croak,但您应该阅读 Carp 的手册,其中部分内容是:

强制堆栈跟踪

作为调试辅助,您可以强制 Carp 在所有模块中将 croak 视为坦白,将 carp 视为咯咯声。换句话说,强制给出详细的堆栈跟踪。这在尝试了解生成警告或错误的原因或从何处生成时非常有用。

通过“导入”不存在的符号“详细”来启用此功能。您通常会通过说来启用它

perl -MCarp=verbose script.pl

或通过在 PERL5OPT 环境变量中包含字符串 -MCarp=verbose。

或者,您可以将全局变量 $Carp::Verbose 设置为 true。


正如daxim 在评论中所建议的,也可以考虑Carp::Always

use Carp::Always;

让每个warn()die() 在呼叫包和其他地方大声抱怨。更常用于命令行:

perl -MCarp::Always script.pl

XML::SAX::PurePerl 的纯 Perl 实现被其维护者标记为“慢”。您或许应该考虑使用许多其他基于 XS 的 SAX 模块之一,尤其是提供自动编码检测的模块。

【讨论】:

  • Carp::Always(::Color)?劫持所有错误以提供堆栈跟踪,即使原始没有使用Carp
  • @daxim:谢谢 - 我添加了 Carp::Always 的规范 (search.cpan.org) 链接。
【解决方案2】:

要调试 perl 脚本,您可以使用:

perl -d:DebugHooks::Terminal script.pl

this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多