首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在perl中尝试使用PackageName::ModuleName-> subroutine (“xyz”)调用子例程时,获取错误的参数值

在perl中尝试使用PackageName::ModuleName-> subroutine (“xyz”)调用子例程时,获取错误的参数值
EN

Stack Overflow用户
提问于 2015-10-14 17:58:21
回答 2查看 41关注 0票数 1

当尝试调用其他perl文件中的子例程(在用户定义的模块中定义)时,获取错误的参数值

代码语言:javascript
复制
#moduleName.pm

package PackageName::moduleName;
use strict;
use warnings;
use base 'Exporter';

sub callMe{
    my($readArg)=(@_);
    print $readArg;
 }


#test.pl

use strict;
use warnings;
use FindBin;                 # locate this script
use lib 'path to parent directory';  # use the parent directory
use PackageName::moduleName;

if( my $temp=PackageName::moduleName->callMe("test")){
    print" True : $temp\n";
}

该函数将$temp的值打印为: PackageName::moduleName

找不到原因。

附注:在调用子例程时,我必须保持相同的约定

EN

回答 2

Stack Overflow用户

发布于 2015-10-14 18:06:26

您正在使用Foo::Bar->frobnicate(@args)将函数作为类方法调用。在这种情况下,由于箭头->,Perl将执行以下操作

检查箭头左侧的内容,如果是CGI)

  • if,则查找包(例如,Foo::Bar)

is

    • is blessed it's $q,假设它是一个包

在该包命名空间中,找到名称位于箭头右侧的子项(例如,frobnicate)

  • call该子项,并将箭头左侧的内容作为
  • 传递给

现在它看起来像这样:

代码语言:javascript
复制
Foo::Bar::frobnicate('Foo::Bar', @args);

在frobnicate中,你必须处理这个问题:

代码语言:javascript
复制
sub frobnicate {
  my ($class, @args) = @_;
  # ...
}

这通常是在new中完成的,这是类方法最可能的用法。

如果您不想处理它,可以直接在其名称空间中调用sub,而不是使用箭头表示法。

代码语言:javascript
复制
my $rv = Foo::Bar::frobnicate(@args);
票数 3
EN

Stack Overflow用户

发布于 2015-10-14 18:04:12

因为你通过->调用它的方式。

当你这样做的时候,perl会传递额外的参数,所以你可以构造一个构造器(new)。

例如。

代码语言:javascript
复制
 my $thing = Package::Module -> new(); 

传递的第一个参数是类,因此可以将其用于bless。请参阅:perlootut

例如。

代码语言:javascript
复制
sub new { 
    my ( $class, @args ) = @_;
    my $self = {};
    bless ( $self, $class ); 
}

当您调用实例化的对象时,这也适用:

代码语言:javascript
复制
$thing -> do_something(); 

它传递一个对$self的引用作为第一个参数。

代码语言:javascript
复制
sub do_something { 
    my ( $self, @args ) = @_;
    print "Got args of @args\n";
    $self -> {firstarg} = shift ( @args ); 
}

如果您想这样做,请尝试:

代码语言:javascript
复制
PackageName::ModuleName::callMe("test"); 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33122263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档