Perl 如何在原型检查中作弊?

Perl 如何在原型检查中作弊?,perl,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

想要为一些外部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;
    }
};
是否可能在原型检查时“作弊”,或者我必须这样写我的包装

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

    sub func($$) { Some::func($_[0],$_[1]); }
还有其他选择

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

方法调用总是忽略原型。

dup只包含
goto&name
。(不包括子参考和
*
)。这是一个简单明了的答案,“重复”在问题本身中回答了你的问题。我认为这是一个非常糟糕的复制选择。我重新提出了这个问题,因为这个问题比另一个问题清楚得多,而且更有可能对其他人有用
goto&name
类似于
&name
,但它会从堆栈中删除堆栈帧。您可能希望从
croak
(通常是一件坏事)对其执行此操作,或者为了节省内存,但速度稍慢。
&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.