请帮我调试SQL :: Translator

时间:2015-09-12 10:26:10

标签: perl

我在Ubuntu 15.04上安装了libsql-translator-perl并使用

运行它
sqlt -f SQLite -t MySql /tmp/test.sql /tmp/out.sql

test.sql仅包含:

CREATE TABLE X (id INTEGER);

失败了

Use of uninitialized value $name in pattern match (m//) at /usr/share/perl5/SQL/Translator.pm line 610.

我查看了这个文件,它包含

sub load {
    my $name = shift;
    my @path;
    push @path, "" if $name =~ /::/; # error here

调用堆栈显示已使用

调用它
SQL::Translator::load(undef, 'SQL::Translator::Producer')

从这里

sub _load_sub {
    my ($tool, @path) = @_;

    my (undef,$module,$func_name) = $tool =~ m/((.*)::)?(\w+)$/;
    if ( my $module = load($module => @path) ) {                    # <<<<<<<
        my $sub = "$module\::$func_name";
        return wantarray ? ( \&{ $sub }, $sub ) : \&$sub;
    }
    return undef;
}

我不知道Perl可以进一步取消这个。有谁知道可能会发生什么?感谢。

2 个答案:

答案 0 :(得分:2)

错误消息告诉您$name未定义;它设置为第一个参数,即$module_load_sub的值,设置为m/((.*)::)?(\w+)$/中第二个捕获的匹配:$tool之前的值::第一次出现::,如果出现$tool,则不确定。

因此::不包含字符串?;匹配模式解释了这一点(通过包含load元字符),但perl -d中的代码并不存在。看起来像代码中的错误。 The documentation列出了几种报告方式或验证是否已报告或修复此方法。

您可以通过 public void doSomething (List<int> myPassedList) { List<int> list = myPassedList.GetRange(0, myPassedList.Count); } 运行Perl代码来调试它 - 请参阅its manual

答案 1 :(得分:0)

MySQL的SQL :: Translator解析器被称为&#34; MySQL&#34;,而不是&#34; MySql&#34;。

sqlt -f SQLite -t MySQL /tmp/test.sql /tmp/out.sql

运行sqlt -l将为您提供可用解析器的完整列表。

但我当然同意错误信息可能更好。值得针对此提出一个错误。