【问题标题】:Perl OOP BlessingPerl OOP 祝福
【发布时间】:2013-08-13 22:53:05
【问题描述】:

我是 Perl 新手,我一直在学习本教程 http://qntm.org/files/perl/perl.html

无论如何,我正在创建一个包含矩阵并执行各种基本操作(即高斯消除、rref、后退、行列式等)的包。我让我的构造函数接收了一个引用列表,但是我在祝福它们时遇到了一些麻烦,所以我以后可以访问它们。到目前为止我的代码:

main.pl:

use strict;
use warnings;
use Matrix;

my @list = ([1,1,1],[2,2,2]);
my $matrix = Matrix->new(@list);

$matrix->test();

矩阵.pm:

package Matrix;
    sub new(){
        my $class = shift;
        my $self = [];

        my @params = @_;
        $self = \@params;

        print scalar @{$self->[1]}; #just testing some output...(outputs 3 as expected)

        bless $self,$class;

        return $self;
    }

    sub test(){
        print @{$self->[1]}; #does not output anything
    }

1;

我假设问题是 $self 所指的引用没有被祝福,但我不知道如何做到这一点。任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: perl


    【解决方案1】:

    您忘记在test 中实际定义$self;它不会自动为您提供。这就是为什么你应该总是把use warnings; use strict; 放在每个 Perl 源文件中:这样编译器就会告诉你这些错误。 (另外,写sub new() 而不是sub newtest 也是没有意义的;函数原型不仅是错误的,而且当new 用作方法时会被完全忽略,即new 应该如何使用。)

    【讨论】:

    • 是的。这些应该是sub newsub test,没有括号。而test 的第一行应该是my $self = shift;。如果您将use strictuse warnings 放在Matrix.pmmain.pl 中,您会得到一些帮助——作为词法声明,它们不会扩展到包含的模块。
    • 谢谢它现在似乎工作了!你能解释一下为什么我需要换班吗?当不带参数调用时,我认为 shift 删除并返回 @_ 中的第一个值(应该为空,因为我没有将任何参数传递给测试)。
    • @William:您正在将参数传递给test。任何方法调用的第一个参数始终是调用该方法的对象或类名。
    猜你喜欢
    • 2014-01-19
    • 2014-07-29
    • 2011-05-04
    • 2014-01-17
    • 2011-10-29
    • 2011-07-26
    • 2010-09-28
    • 2011-11-14
    • 2011-03-28
    相关资源
    最近更新 更多