如何欺骗原型检查?

时间:2015-12-02 16:50:59

标签: perl

想要为一些外部perl模块编写一个简单的包装器。简化示例:

use 5.014;
use warnings;

#foreign package
package Some {
    sub func {
        my($x,$y) = @_;
        return $x.$y;
    }
};

#my own packages
package My {
    #use Some ();
    sub func { Some::func(@_); }
}

package main {
    #use My;
    say My::func("res","ult");
}

这样可以正常工作并打印result

但现在我遇到一个使用原型的模块,例如以上看起来像:

package Some {
    sub func($$) {     # <-- prototype check
        my($x,$y) = @_;
        return $x.$y;
    }
};

尝试使用My包装程序包时,它会说:

Not enough arguments for Some::func at ppp line 16, near "@_)"

原型检查是否可能“作弊”或必须编写我的包装器?

    sub func { Some::func($_[0],$_[1]); }

甚至

    sub func($$) { Some::func($_[0],$_[1]); }

1 个答案:

答案 0 :(得分:7)

&Some::func(@_);  # Bypass prototype check.

还有其他选择。

(\&Some::func)->(@_);  # Call via a reference.
&Some::func;           # Don't create a new @_.
goto &Some::func;      # Don't create a new @_, and remove current call frame from stack.

方法调用总是忽略原型。