【问题标题】:Getting wrong argument value when trying to call a subroutine using PackageName::ModuleName->subroutine("xyz")in perl尝试在 perl 中使用 PackageName::ModuleName->subroutine("xyz") 调用子例程时获取错误的参数值
【发布时间】:2015-10-14 18:09:22
【问题描述】:

当试图在其他 perl 文件中调用子程序(在用户定义的模块中定义)时,得到错误的参数值

#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

不知道为什么。

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

【问题讨论】:

  • 你的命名有点不走运。 package 的名称是 package 关键字之后的所有内容。 模块 的名称通常是相同的。在谈论 CPAN 时,包名称的所有部分(除了最右边的部分)通常称为 namespace。有一个 Data 命名空间,其中包含几个不同的模块,例如 Data::DumperData::PrinterData::Dump

标签: perl


【解决方案1】:

您正在使用Foo::Bar->frobnicate(@args) 将函数作为类方法调用。在这种情况下,Perl 会因为箭头-> 做以下事情:

  • 检查箭头左侧的内容
    • 如果是blessed,找到包(例如$q就是包CGI
    • 如果它没有被祝福,假设它是一个包裹(例如Foo::Bar
  • 在该包命名空间中,找到一个名称在箭头右侧的子(例如frobnicate
  • 调用该子并将箭头左侧的内容作为第一个参数传递

现在看起来像这样:

Foo::Bar::frobnicate('Foo::Bar', @args);

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

sub frobnicate {
  my ($class, @args) = @_;
  # ...
}

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

如果不想处理,直接在其命名空间中调用 sub,不要使用箭头符号。

my $rv = Foo::Bar::frobnicate(@args);

【讨论】:

    【解决方案2】:

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

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

    例如

     my $thing = Package::Module -> new(); 
    

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

    例如

    sub new { 
        my ( $class, @args ) = @_;
        my $self = {};
        bless ( $self, $class ); 
    }
    

    这也适用于您调用实例化对象时:

    $thing -> do_something(); 
    

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

    sub do_something { 
        my ( $self, @args ) = @_;
        print "Got args of @args\n";
        $self -> {firstarg} = shift ( @args ); 
    }
    

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

    PackageName::ModuleName::callMe("test"); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2017-07-19
      • 2016-05-11
      • 2013-11-12
      • 1970-01-01
      相关资源
      最近更新 更多