当前位置:  开发笔记 > 编程语言 > 正文

如何欺骗原型检查?

如何解决《如何欺骗原型检查?》经验,为你挑选了1个好方法。

想为一些外来的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]); }

ikegami.. 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.

方法调用总是忽略原型.



1> ikegami..:
&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.

方法调用总是忽略原型.

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有