여러 메서드로 패키지를 만들고 액세스하려고했지만 해시 값을 제공하고 예상 했습니까? 다음은 코드입니다.
package student_data;
use strict;
use warnings;
use diagnostics;
use Carp;
# init cell with cell name
sub new_student{
my ($class,$args) = @_;
my $self = { student_name => $args->{student_name} || 'default_value',
reg_number => $args->{reg_number} || 'default_value',
dob => $args->{dob} || 'default_value',
subjects=> {}
};
bless $self, $class;
return $self;
}
sub new_subject{
my ($class,$args) = @_;
my $self = { subject_name => $args->{subject_name} || 'default_value',
credit => $args->{credit} || 'default_value',
grade => $args->{grade} || 'default_value',
};
#bless $self, $class;
return $self
}
sub add_subject{
my ($self,$args) = @_;
my $sub1 = $self->new_subject($args);
++$self->{subject}{$sub1};
return $self;
}
sub get_subject{
my ($self, $args) = @_;
#$self->{subject}{$sub1};
return $self;
}
1;
#use student_data;
my @all_students = ();
my $stud1= student_data->new_student({student_name =>"john",reg_number => "12"});
my $sub1 = student_data->new_subject({subject_name => "A" , credit => "3"}) ;
++$stud1->{subjects}{$sub1};
my $sub2 = student_data->new_subject({subject_name => "B" , grade => "50"}) ;
$stud1->add_subject($sub2);
push(@all_students, $stud1);
my $stud2= student_data->new_student({student_name =>"johnny",dob => "110388"});
my $sub3 = student_data->new_subject({subject_name => "B" , credit => "4"}) ;
++$stud1->{subjects}{$sub3};
my $sub4 = student_data->new_subject({subject_name => "A" , grade => "50"}) ;
$stud1->add_subject($sub4);
push(@all_students, $stud2) ;
my $et_stud = pop(@all_students);
print "\n student_name : $et_stud->{student_name} \n dob : $et_stud->{dob} \n subjects : $et_stud->{subjects}";
student_name : johnny
dob : 110388
과목 : HASH (0x10301b8)
하지만 기대합니다.
student_name : johnny reg_number : default_value dob : 110388
subject_name : A
학점 : 3
학년 : default_value
subject_name : B 학점 : default_value 학점 : 50
나는 당신이 Perl 객체 지향을 이해하는 데 정말 먼 길을 택하고있는 것 같아서, 작동하는 버전을 작성하는 것 외에 당신을 도울 방법을 아는 것은 정말 어렵습니다.
I는 (A)의 구성을 변경 한 Student
그 때문에 오브젝트 subjects
필드가있다 어레이 의 Subject
개체
학생당 과목이 중복되는 것을 방지하기 위해 해시를 사용하는 것이 가치가 있다는 것을 알 수 있었지만 원본에없는 경우 오류 처리가 수반됩니다. 그러나 추가 use Carp
했기 때문에 생성자에서 잘못된 인수를 경고하는 데 사용하는 코드를 포함했습니다.
package Student;
use strict;
use warnings 'all';
use Carp;
sub new {
my $class = shift;
my %args = @_;
my $self = {
name => delete $args{student_name} // 'default_value',
reg_number => delete $args{reg_number} // 'default_value',
dob => delete $args{dob} // 'default_value',
subjects => [],
};
carp 'Unexpected arguments ', join ', ', keys %args if keys %args;
return bless $self, $class;
}
sub name {
my $self = shift;
return $self->{name};
}
sub dob {
my $self = shift;
return $self->{dob};
}
sub reg_number {
my $self = shift;
return $self->{reg_number};
}
sub add_subject{
my $self = shift;
my ($subject) = @_;
my $subjects = $self->{subjects};
push @$subjects, $subject;
return $self; # So that add_subject may be chained
}
sub subjects {
my $self = shift;
@{ $self->{subjects} };
}
1;
package Subject;
use strict;
use warnings 'all';
use Carp;
sub new {
my $class = shift;
my %args = @_;
my $self = {
name => delete $args{subject_name} // 'default_value',
credit => delete $args{credit} // 'default_value',
grade => delete $args{grade} // 'default_value',
};
carp 'Unexpected arguments ', join ', ', keys %args if keys %args;
return bless $self, $class;
}
sub name {
my $self = shift;
return $self->{name};
}
sub credit {
my $self = shift;
return $self->{credit};
}
sub grade {
my $self = shift;
return $self->{grade};
}
1;
use strict;
use warnings 'all';
use Student;
use Subject;
my @all_students;
my $student;
$student = Student->new( student_name => 'john', reg_number => 12 );
$student->add_subject( Subject->new( subject_name => 'A', credit => 3 ) );
$student->add_subject( Subject->new( subject_name => 'B', grade => 50 ) );
push @all_students, $student;
$student = Student->new( student_name => 'johnny', dob => '110388' );
$student->add_subject( Subject->new( subject_name => 'B', credit => 4 ) );
$student->add_subject( Subject->new( subject_name => 'A', grade => 50 ) );
push @all_students, $student;
my $et_stud = pop @all_students;
printf "student_name: %s\n", $et_stud->name;
printf "reg_number: %s\n", $et_stud->reg_number;
printf "dob: %s\n", $et_stud->dob;
for my $subject ( $et_stud->subjects ) {
print "\n";
printf " subject_name: %s\n", $subject->name;
printf " credit: %s\n", $subject->credit;
printf " grade: %s\n", $subject->grade;
}
student_name: johnny
reg_number: default_value
dob: 110388
subject_name: B
credit: 4
grade: default_value
subject_name: A
credit: default_value
grade: 50
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다