2

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

1.我想创建一个简单的班级,其中包含学生姓名、卷号和6个科目分数的信息。
2.我还想创建一个子程序来计算分数的百分比。
3.还想通过创建子类来演示用户继承,该子类将具有滚动编号、父类的名称以及添加新字段地址和电话号码。
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;

我还创建了 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";
4

2 回答 2

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} }

有两件事需要解决:

  • 您没有祝福实例-这确实使引用属于该类
  • from 的参数%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');
    

has为你声明一个属性,你就可以免费获得构造函数。

于 2013-04-21T08:19:01.697 回答
1

您只是忘记使用bless$self祝福new. 可以在此处找到正确 ctor 定义的简单示例。

于 2013-04-21T06:14:17.060 回答