2017-09-25 1 views
1

J'essaie de définir et d'obtenir les valeurs dans les classes utilisant perl.Comment définir et utiliser class en perl?

ci-dessous est ma classe parente math.pm.

use strict; 
package math; 

sub new 
{ 
     my $class=shift; 
     my $self={}; 
     bless($self,$class); 
     return $self; 
} 

sub set_number 
{ 
     my $self=shift; 
     my $self->{'num'}=shift; 
} 

sub get_number 
{ 
     my $self=shift; 
     return $self->{'num'}; 
} 

sub add 
{ 
     my $self=shift; 
     my $num1=shift; 
     my $num2=shift; 
     return $num1 + $num2; 
} 

sub multiply 
{ 
     my $self=shift; 
     my $num1=shift; 
     my $num2=shift; 
     return $num1 * $num2 ; 
} 

1; 

ci-dessous est le script d'où im appelant la classe parente math dans une classe dérivée appelée operations

use strict; 
use math; 

package operations; 
our @ISA = qw/math/; 

my $number_obj1=operations->new(); 
my $number_obj2=operations->new(); 
my $number_obj3=operations->new(); 

$number_obj1->set_number("23"); 
$number_obj2->set_number("24"); 

my $num1=print $number_obj1->get_number(); 
my $num2=print $number_obj2->get_number(); 

print "\n\$num1:$num1\n\$num2:$num2\n"; 

print "addition: ",$number_obj3->add("$num1","$num2"),"\n"; 
print "multiplication: ",$number_obj3->multiply("$num1","$num2"),"\n"; 

sortie incorrecte:

$num1:1 
$num2:1 
addition: 2 
multiplication: 1 

dans le script ci-dessus je ne suis pas en mesure pour extraire les valeurs dans $num1 et $num2 en utilisant le sous-programme get_number.

Où vais-je mal?

+3

S'il vous plaît noter que par convention, les paquets de Perl doivent commencer par une lettre majuscule. Le nom correct pour votre classe serait 'Math', pas' math'. Tous les noms minuscules sont réservés à _pragmas_ comme 'strict'. – simbabque

+2

Je vous suggère de publier ce code sur [codereview.se]. Il y a quelques problèmes stylistiques ainsi qu'un peu de connaissances générales Perl qui vous semblent manquer. Je crois que vous bénéficieriez grandement d'un examen du code approprié. – simbabque

+0

Notez que 'operations' est un programme simple, pas une classe dérivée du tout (il n'a pas de méthodes, pas même un constructeur). Vous devez omettre l'instruction 'package' et l'affectation à' @ ISA'. – Borodin

Répondre

2

Allumez warnings et il vous dira:

"my" variable $self masks earlier declaration in same scope at line 17. 

Vous devez changer:

sub set_number { 
    my $self = shift; 
    my $self->{'num'} = shift; 
} 

Ce deuxième my est ce qui se casser, parce qu'il est la création d'une nouvelle instance de $self.

aussi: my $num = print ..

est presque certainement pas en train de faire ce que vous voulez qu'il - il est la mise $num au code de retour de print.

Essayez plutôt:

my $num1 = $number_obj1->get_number(); 
my $num2 = $number_obj2->get_number(); 

Sortie:

$num1:23 
$num2:24 
addition: 47 
multiplication: 552 
+0

Ce n'est pas tout. J'ai aussi noté cela, mais une fois qu'il est corrigé, il produira toujours seulement 1 comme valeurs. Il doit y avoir un problème de contexte de liste quelque part ... c'est le 'print'. – simbabque

+1

Oui. Affectation du résultat de 'print' par les regards. – Sobrique