1

我正在研究一个 Perl 模块,每当我调用skip()我以下列方式编写的方法时:

$cursor->skip(4);

我得到:

在 t/tester.pl 第 24 行调用了未定义的子例程 &MyModule::Cursor::skip。
        (在清理中)t/tester.pl 第 24 行的无效对象。

当我这样称呼它时:

MyModule::Cursor::skip($cursor, 4);

Perl 找到了!

奇怪的是,如果我将“ ”命名为skip其他任何名称(“ skipper”、“ hello”),则此语法有效:

$cursor->skipper(4);

我想可能skip()是一个“秘密”的保留关键字或其他东西,但我也有名为sort()and的方法next()(我知道它们是保留的),并且这些工作正常。

我真的很想将此方法命名为“ skip。” 有谁知道为什么 Perl 找不到它?

4

2 回答 2

6

skip()是从 导出的Test::More,因为您的可执行文件名为t/tester.pl.

什么ref($cursor)给你?它应该是一个祝福MyModule::Cursor对象,但“ invalid object”错误可能表明该对象构造不正确。

编辑:perldiag给出了另一个线索:“ in cleanup”表示对象的析构函数遇到了问题。假设您在对象中还没有析构函数,请创建一个作为对象的MyModule::Cursor::DESTROY方法Data::Dump以查看此时它的样子。

展示此行为的简洁示例代码片段将非常有帮助。

于 2009-08-14T22:28:13.067 回答
2

没有实际代码,很难调试。

您在测试代码中使用 MyModule::Cursor吗?当您将skip替换为skipper时,您是否在测试模块中以完全相同的方式调用它?您是否可以从一次性(单行或非常短的脚本)中使用跳过?

我要去的地方是在您的测试代码中寻找错误,而不是在模块中。

更新:您没有在两个不同的文件中做类似在MyModule::Cursor上声明方法之类的事情,是吗?您收到的错误消息告诉我它有一个对MyModule::Cursor类型对象的祝福引用,因此它知道该类;但是它找不到skip的定义。您是否碰巧在一个文件中声明了MyModule::Cursor的一部分,然后在另一个文件中跳过,而您的测试模块不包括第二个文件?或者你的skip定义周围有语法错误——缺少分号或不成对的花括号?(但话又说回来,为什么MyModule::Cursor::skip$cursor->skip才不是?)

于 2009-08-15T18:06:32.603 回答