2017-09-25 14 views
1

我試圖設置和獲取使用類的perl中的值。如何在perl中設置和使用類?

以下是我的父類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; 
下面

是從哪兒IM調用父類math在派生類中調用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"; 

不當輸出腳本:在上面的腳本

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

我不能使用get_number子例程將值提取到$num1$num2

我哪裏錯了?

+3

請注意,按照慣例,在Perl軟件包名稱應以大寫字母開頭。你的班級的正確名字是'Math',而不是'math'。所有小寫​​名稱都保留給像'strict'這樣的_pragmas_。 – simbabque

+2

我建議你在[codereview.se]上發佈這段代碼。有一些風格問題,以及一些你看起來缺乏的Perl常識。我相信你會從正確的代碼審查中受益匪淺。 – simbabque

+0

請注意,'操作'是一個簡單的程序,根本不是派生類(它沒有方法,甚至沒有構造函數)。你應該省略'package'語句和賦值給'@ ISA'。 – Borodin

回答

2

打開warnings,它會告訴你:

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

你需要改變:

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

這第二my是什麼打破它,因爲它創造了$self一個新的實例。

另外:my $num = print ..

幾乎是肯定不會做你希望它是什麼 - 它的設置$numprint返回代碼。

嘗試,而不是:

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

輸出:

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

這還不是全部。我也發現,但一旦它被修復,它仍然只會產生'1'作爲值。在某處必須有一個列表上下文問題......這是'print'。 – simbabque

+1

是的。用外觀分配'print'的結果。 – Sobrique