我想创建一个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)
对不起,我对此很陌生,但仍然不明白。
答案 0 :(得分:5)
这看起来很像一个家庭作业问题,所以我很想给你一个完整的答案。您似乎对Perl知之甚少,并且几乎没有花时间阅读Perl的面向对象的想法,使用疯狂的猜测填补空白。你不会那样学习语言
你应该从不使用和号调用Perl子例程,并且需要在类或对象上调用方法,因此&new
应该是{{ 1}}。您编写的每个Perl源文件也应以Data->new(...)
和use strict
这是创建对象的一种非常奇怪的方式。您通常会创建一个单独的Perl程序,该程序执行use warnings 'all'
然后use Data
。相反,您正在调用my $object = Data->new($student)
,它不传递任何参数,并且是未初始化值错误的原因
您的&new
值应该是什么并不明显,但是在使用$student
从shift
获取其值后,您将使用哈希引用覆盖它< / p>
您还应该通过@_
构造函数调用传递哈希内容的值,而不是让模块本身从new
读取。您也没有STDIN
这些值,因此他们会保留他们不太想要的终止换行符
我建议您将代码分为chomp
(可能Data.pm
?)和Student.pm
,然后使用常量值编写代码,而不是从键盘上读取
像这样的东西
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框架所取代。使用它可能会有更多的成功。