gpt4 book ai didi

Perl 模块方法调用 : Can't call method "X" on an undefined value at ${SOMEFILE} line ${SOMELINE}

转载 作者:行者123 更新时间:2023-12-04 13:15:08 35 4
gpt4 key购买 nike

在所有地方,尤其是在 DBI 中,我总是看到这条消息出现。这令人困惑,因为首先想到的是我传递函数的参数设置为 undef(或类似的东西),但显然不是这样。

给定一个模块和相应的脚本...

模块:./lib/My/Module.pm

package My::Module;

use strict;
use warnings;

sub trim {
my $str = shift;
$str =~ s{ \A \s+ }{}xms; # remove space from front of string
$str =~ s{ \s+ \z }{}xms; # remove space from end of string
return $str;
}

脚本: ./test.pl
#!/usr/bin/perl

use strict;
use warnings;
use My::Module qw(trim);

print $My::Module->trim( " \t hello world\t \t" );

我收到错误消息

Can't call method "trim" on an undefined value at ./text.pl line 7.



事实上,如果我调用 $My::Module->notamethod( "hello world" );它给出了类似的错误。

上面的脚本/模块有什么问题?

那个错误是什么 Can't call method “X” on an undefined value at ${SOMEFILE} line ${SOMELINE}真的在说吗?
这是指方法调用的上下文(在这里传递给打印),还是参数的上下文?

最佳答案

您将几种不同的方式来处理模块和对象混为一谈 - 最终得到一种不起作用的方式。

以下是四种可行的方法:

1/My::Module 是一个库。不导出修剪。

$ cat My/Module.pm 
package My::Module;

use strict;
use warnings;

sub trim {
my $str = shift;

$str =~ s{ \A \s+ }{}xms; # remove space from front of string
$str =~ s{ \s+ \z }{}xms; # remove space from end of string
return $str;
}

1;
$ cat test
#!/usr/bin/perl

use strict;
use warnings;

use My::Module;

# Note: No $ and :: not ->
print My::Module::trim( " \t hello world\t \t" );

2/My::Module 是一个库。修剪被导出。
$ cat My/Module.pm 
package My::Module;

use strict;
use warnings;

use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(trim);

sub trim {
my $str = shift;

$str =~ s{ \A \s+ }{}xms; # remove space from front of string
$str =~ s{ \s+ \z }{}xms; # remove space from end of string
return $str;
}

1;
$ cat test
#!/usr/bin/perl

use strict;
use warnings;

use My::Module;

print trim( " \t hello world\t \t" );

3/MyModule 是一个类。 trim 是一个类方法。
$ cat My/Module.pm 
package My::Module;

use strict;
use warnings;

sub trim {
# Note class name passed as first argument
my $class = shift;
my $str = shift;

$str =~ s{ \A \s+ }{}xms; # remove space from front of string
$str =~ s{ \s+ \z }{}xms; # remove space from end of string
return $str;
}

1;
$ cat test
#!/usr/bin/perl

use strict;
use warnings;

use My::Module;

# Note: Not $ and -> not ::
print My::Module->trim( " \t hello world\t \t" );

4/MyModule 是一个类,trim 是一个对象方法。
$ cat My/Module.pm 
package My::Module;

use strict;
use warnings;

# Need a constructor (but this one does nothing useful)
sub new {
my $class = shift;

return bless {}, $class;
}

sub trim {
# Note: Object method is passed an object (which is ignored here)
my $self = shift;
my $str = shift;

$str =~ s{ \A \s+ }{}xms; # remove space from front of string
$str =~ s{ \s+ \z }{}xms; # remove space from end of string
return $str;
}

1;
$ cat test
#!/usr/bin/perl

use strict;
use warnings;

use My::Module;

my $trimmer = My::Module->new;

print $trimmer->trim( " \t hello world\t \t" );

我认为您正在尝试选项 1。在这种情况下,我想我会推荐选项 2。

并回答你的最后一个问题。您收到该错误是因为您试图在 undefined variable ($My::Module) 上调用方法。

关于Perl 模块方法调用 : Can't call method "X" on an undefined value at ${SOMEFILE} line ${SOMELINE},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3597605/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com