Perl 找不到对象方法

标签 perl

这是我第一次使用 perl (v5.28.1)。我收到错误:

'Can't locate object method "load" via stepReader (perhaps you forgot to load 'stepReader')'. 

当我在文件中打印某些内容时,它可以工作,但不知何故找不到我的方法。

我有 stepReader.pm在名为 src 的子目录中

**

示例.pm
use lib 'src/';
use stepReader;

@ISA = ('stepReader');

my $class = stepReader->load('assets/glasses.STEP');

stepReader.pm
package src::stepReader;

use strict;
use warnings;

sub load {  
    # Variable for file path
    my $filename = @_;
    # Open my file
    open(my $fh, '<:encoding(UTF-8)', $filename)
        or die "Could not open file '$filename' $!";

    # Print the file!
    while (my $row = <$fh>) {
        chomp $row;
        print "$row\n";
    }

    return bless {}, shift;
}

print "test if this works!";

1;

输出:
Can't locate object method "load" via package "stepReader" (perhaps you forgot to load "stepReader"?) at example.pm line 6.
test if this works!

我怀疑这很容易,但我希望有人能帮助我。提前致谢

最佳答案

直接的问题是没有名为 stepReader 的类。在您的代码中,只有 src::stepReader :

package src::stepReader;


即函数调用src::stepReader::load ,而不是 stepReader::load .将包声明更改为:
package stepReader;

此外,以小写字母开头的模块名称非正式地保留给 pragmata。对于普通模块,约定是使用大写字母:
package StepReader;

(并重命名文件 StepReader.pm 以匹配)。

参数解包也被破坏:

    # Variable for file path
    my $filename = @_;


这使得 @_标量上下文中的数组,给出元素的数量。您需要列表赋值(左侧有括号),并且方法调用将调用者作为隐式的第一个参数传递:
    my ($class, $filename) = @_;

    ...
    return bless {}, $class;

或者:
    my $class = shift;
    my ($filename) = @_;

或者
    my $class = shift;
    my $filename = shift;

您应该始终以 use strict; use warnings; 开始您的文件。或等效的。 example.pm 目前缺少它:
use strict;
use warnings;
use lib 'src';
use StepReader;

# This line is not needed, but if it were:
# our @ISA = ('StepReader');

关于Perl 找不到对象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57771227/

相关文章:

php - 如何使用perl、php获取图片元数据

perl - glob ('foo*' ) 相对于 <foo*>​​ 的比较优势是什么?

linux - 修改文件中的文本(百万列,制表符分隔)- 删除除第一个选项卡之外的所有选项卡并在最后一列后面添加新列

regex - Perl 匹配输入中的下一个

bash - 如何削减一年中每个月的第一个星期日至星期六?

perl - $ _的范围:为什么这会改变它?

perl - 如何在 Perl 中的两个数字之间创建一个随机数

java - Perl 转义引号问题

perl - 如何调整长期物体的渲染?

windows - 如何使用系统 (Windows) 从 Perl 调用子目录中的脚本