我无法上课

时间:2018-04-21 09:51:30

标签: perl class

我想创建一个Perl类。

这是我的代码:

#!/usr/ bin/perl

package Data;

sub new
{ my ($class, $student) = @_;
$class = shift;
$student = shift;
$student = {_firstName => <>,
            _lastName => <>,
             _matric => <>,
            };
bless $student,$class;
print $student;
}
&new;    

我收到了这个错误:

  

main = HASH(0x215fc40)在source_file.pl第12行使用未初始化的值$ class。   在source_file.pl第12行显式祝福''(假设包main)。

我使用dcoder,我认为它不支持分离程序。但是虽然我纠正了它,但它仍然没有输出。我试图打印$self但是它留下了错误。这是整个代码:

#!/usr/ bin/perl
use strict;
use warnings 'all';

package student;

sub new {
 my $class = shift;
    my ($first, $last, $matric) = @_;
    my $self = {
        _firstName => $first,
        _lastName => $last,
        _matric => $matric,
        };
    bless $self, $class;
    }

my $self = student->new('victor','valdes','csc');
print $self;

这是错误:

  

学生= HASH(0x238ae98)

对不起,我对此很陌生,但仍然不明白。

2 个答案:

答案 0 :(得分:5)

这看起来很像一个家庭作业问题,所以我很想给你一个完整的答案。您似乎对Perl知之甚少,并且几乎没有花时间阅读Perl的面向对象的想法,使用疯狂的猜测填补空白。你不会那样学习语言

你应该从不使用和号调用Perl子例程,并且需要在类或对象上调用方法,因此&new应该是{{ 1}}。您编写的每个Perl源文件也应以Data->new(...)use strict

开头

这是创建对象的一种非常奇怪的方式。您通常会创建一个单独的Perl程序,该程序执行use warnings 'all'然后use Data。相反,您正在调用my $object = Data->new($student),它不传递任何参数,并且是未初始化值错误的原因

您的&new值应该是什么并不明显,但是在使用$studentshift获取其值后,您将使用哈希引用覆盖它< / p>

您还应该通过@_构造函数调用传递哈希内容的值,而不是让模块本身从new读取。您也没有STDIN这些值,因此他们会保留他们不太想要的终止换行符

我建议您将代码分为chomp(可能Data.pm?)和Student.pm,然后使用常量值编写代码,而不是从键盘上读取

像这样的东西

Student.pm

main.pl

main.pl

package Student;

use strict;
use warnings 'all';

sub new {
    my $class = shift;
    my ($first, $last, $matric) = @_;

    my $self = {
        _firstName => $first,
        _lastName  => $last,
        _matric    => $matric,
    };

    bless $self, $class;
}

1;

答案 1 :(得分:3)

如果您坚持要将所有代码保存在一个文件中,那么您至少应该移动&#34;非类&#34;将代码放入一个单独的包中。

#!/usr/ bin/perl

use strict;
use warnings 'all';

# Capital letters for user-defined packages, please
package Student;

sub new {
    my $class = shift;
    my ($first, $last, $matric) = @_;
    my $self = {
        _firstName => $first,
        _lastName => $last,
        _matric => $matric,
    };
    bless $self, $class;
}

package main;

# $self is only used as a variable name within methods.
my $student = Student->new('victor','valdes','csc');
print $student;

但这只是一种很好的做法,它并不会影响代码中的任何内容。你说你得到这个输出:

  

学生= HASH(0x238ae98)

您将其描述为错误,但它根本不是错误,这正是我对您的代码所期望的。您的$self变量(我已将其重命名为$student)是一个有福的哈希引用。如果你打印一个有福的哈希引用,那就是你得到的。

但是如果你想看到你对象的更多结构,你可以使用Data :: Dumper(一个标准的Perl库)。

package main;

use Data::Dumper;

# $self is only used as a variable name within methods.
my $student = Student->new('victor','valdes','csc');
print Dumper $student;

这让我:

$VAR1 = bless( {
                 '_lastName' => 'valdes',
                 '_firstName' => 'victor',
                 '_matric' => 'csc'
               }, 'Student' );

我不清楚你对print()陈述的期望是什么。但是如果要显示对象的属性,则需要在类中编写访问器方法。例如,返回matric值的方法如下所示:

sub matric {
    my $self = shift;
    return $self->{_matric};
}

在主程序包中,您可以这样称呼它:

print $student->matric;

但我必须同意鲍罗丁。看起来你很想在Perl中自学面向对象编程而不了解面向对象编程或Perl。猜测概念和语法很少是一种成功的方法。

我还要补充一下&#34; classic&#34;您正在使用的Perl OO风格已经被Moo等现代OO框架所取代。使用它可能会有更多的成功。