针对学生的perl oops计划,他们的分数和百分比

sam*_*sam 2 oop perl class

我是perl的新手.我有一个程序要做.

1.我想创建一个简单的课程,其中包含学生姓名,掷骰号和6个科目标记的信息.
我还想创建一个子程序来计算标记的百分比.
3.还想通过创建子类来演示用户继承,子类将具有roll no,来自父类的名称以及添加新的字段地址和电话号
.4.创建覆盖百分比子例程的方法.

我经历了很多perl文档,但却无法解决这个问题,我也无法解决2,3和4问题.

我现在的代码粘贴在下面,但似乎也没有用.任何人都可以让我知道我该怎么做这个程序,以便我可以学习所有这些?

我的代码:

class.pm  

package class;

#constructor
sub new 
{
#my ($class) = @_;
my ($class, %arg) = @_;
my $self = 
{
    _name => $arg{_name}    ,
    _roll_no => $arg{_roll_no}    ,
    _sub1 => $arg{_sub1}    ,
    _sub2 => $arg{_sub2}    ,
    _sub3 => $arg{_sub3}    ,
    _sub4 => $arg{_sub4}    ,
    _sub5 => $arg{_sub5}    ,
    _sub6 => $arg{_sub6}    
};
, $class;
}  

sub name        { $_[0] -> {_name}     }
sub roll_no     { $_[0] -> {_roll_no} }
sub sub1    { $_[0] -> {_sub1}}
sub sub2    { $_[0] -> {_sub2}}
sub sub3    { $_[0] -> {_sub3}}
sub sub4    { $_[0] -> {_sub4}}
sub sub5    { $_[0] -> {_sub5}}
sub sub6    { $_[0] -> {_sub6}}

1;
Run Code Online (Sandbox Code Playgroud)

我也创建了class1.pm

class1.pm


use class;

print "Object 1:\n\n";

my $obj1 = class->new(
name => "sam"    ,
roll_no => "1"    ,
sub1 => "99"    ,
sub2 => "98"    ,
sub3 => "97"    ,
sub4 => "96"    ,
sub5 => "95"    ,
sub6 => "96" 
);


print $obj1->name, "\n";
print $obj1->roll_no, "\n";
print $obj1->sub1, "\n";
print $obj1->sub2, "\n";
print $obj1->sub3, "\n";
print $obj1->sub4, "\n";
print $obj1->sub5, "\n";
print $obj1->sub6, "\n";
Run Code Online (Sandbox Code Playgroud)

bvr*_*bvr 5

这是修复的类,使您的测试代码工作:

package class;

sub new {
    my ($class, %arg) = @_;

    my $self = {
        _name    => $arg{name},
        _roll_no => $arg{roll_no},
        _sub1    => $arg{sub1},
        _sub2    => $arg{sub2},
        _sub3    => $arg{sub3},
        _sub4    => $arg{sub4},
        _sub5    => $arg{sub5},
        _sub6    => $arg{sub6}
    };
    return bless $self, $class;
}

sub name    { $_[0]->{_name} }
sub roll_no { $_[0]->{_roll_no} }
sub sub1    { $_[0]->{_sub1} }
sub sub2    { $_[0]->{_sub2} }
sub sub3    { $_[0]->{_sub3} }
sub sub4    { $_[0]->{_sub4} }
sub sub5    { $_[0]->{_sub5} }
sub sub6    { $_[0]->{_sub6} }
Run Code Online (Sandbox Code Playgroud)

有两件事需要修复:

  • 你没有祝福实例 - 这确实使得引用属于类
  • 参数来自%args额外的下划线 - 在你的例子中,你是通过name => "sam",而不是_name => "sam"

结合更多笔记:

  • perl中的小写包名称通常由pragma使用.更好的做法是使用CamelCase进行类命名
  • 有大量的模块可以帮助您进行类定义,例如上面的Class :: Accessor,以及更复杂的OO构建器,如Moose.对于后者,您的类定义将如下所示:

    package class;
    use Moose;
    
    has name    => (is => 'ro');
    has roll_no => (is => 'ro');
    has sub1    => (is => 'ro');
    has sub2    => (is => 'ro');
    has sub3    => (is => 'ro');
    has sub4    => (is => 'ro');
    has sub5    => (is => 'ro');
    has sub6    => (is => 'ro');
    
    Run Code Online (Sandbox Code Playgroud)

has 为您声明一个属性,您可以免费获得构造函数.