为什么我的Perl对象不能找到它的skip()方法,即使我可以将其称为子例程?

kri*_*ina 1 perl perl-module xs

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

$cursor->skip(4);
Run Code Online (Sandbox Code Playgroud)

我明白了:

Undefined subroutine &MyModule::Cursor::skip called at t/tester.pl line 24.
        (in cleanup) invalid object at t/tester.pl line 24.

当我称之为:

MyModule::Cursor::skip($cursor, 4);
Run Code Online (Sandbox Code Playgroud)

Perl发现了!

奇怪的是,如果我将" skip" 命名为" "(" skipper"," hello"),则此语法有效:

$cursor->skipper(4);
Run Code Online (Sandbox Code Playgroud)

我想也许skip()是一个"秘密"保留的关键词或者其他东西,但我也有方法命名sort()next()(我知道是保留的),这些工作正常.

我真的很想把这个方法命名为" skip." 有谁知道为什么Perl找不到它?

Eth*_*her 6

skip()是从Test::More您的可执行文件命名后可能已加载的t/tester.pl.

什么ref($cursor)让你感兴趣?它应该是一个受祝福的MyModule::Cursor对象,但" invalid object"错误可能表明该对象未正确构造.

编辑:perldiag给出了另一条线索:" in cleanup"表示对象的析构函数遇到了问题.假设您在对象中还没有析构函数,请创建一个MyModule::Cursor::DESTROY方法,Data::Dump该对象可以在此时查看它的外观.

展示此行为的简洁示例代码片段将非常有用.