加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 如何欺骗原型检查?

发布时间:2020-12-16 06:05:35 所属栏目:大数据 来源:网络整理
导读:想为一些外来的perl模块写一个简单的包装器.简化示例: use 5.014;use warnings;#foreign packagepackage Some { sub func { my($x,$y) = @_; return $x.$y; }};#my own packagespackage My { #use Some (); sub func { Some::func(@_); }}package main { #u
想为一些外来的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");
}

这样可以正常打印结果.

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

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

在尝试使用My wrapper包时,它说:

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

可能在原型检查中“作弊”,或者我必须编写我的包装器吗?

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

甚至

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

解决方法

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

方法调用总是忽略原型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读