当尝试调用其他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
找不到原因。
附注:在调用子例程时,我必须保持相同的约定
发布于 2015-10-14 18:06:26
您正在使用Foo::Bar->frobnicate(@args)将函数作为类方法调用。在这种情况下,由于箭头->,Perl将执行以下操作
检查箭头左侧的内容,如果是CGI)
Foo::Bar)is
blessed it's $q,假设它是一个包
在该包命名空间中,找到名称位于箭头右侧的子项(例如,frobnicate)
现在它看起来像这样:
Foo::Bar::frobnicate('Foo::Bar', @args);在frobnicate中,你必须处理这个问题:
sub frobnicate {
my ($class, @args) = @_;
# ...
}这通常是在new中完成的,这是类方法最可能的用法。
如果您不想处理它,可以直接在其名称空间中调用sub,而不是使用箭头表示法。
my $rv = Foo::Bar::frobnicate(@args);发布于 2015-10-14 18:04:12
因为你通过->调用它的方式。
当你这样做的时候,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"); https://stackoverflow.com/questions/33122263
复制相似问题