2013-09-28 47 views
2

我是OO perl的新手。我正在嘗試寫一個簡單的程序,但得到錯誤。在面向對象的perl中獲取問題

創建一個包Employee.pm作爲

package Employee; 

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

sub get_names { 
    my $self = @_; 
    print " getting the names \n"; 
    return $self; 
} 

sub set_names { 
    my ($self, $last_name) = @_; 
    $self->{last_name} = $last_name; 
    return $self->{$last_name}; 
} 
1; 

而且創造了一個特等文件

use strict; 
use warnings; 

use Employee; 

my $obj = new Employee("name" => "nitesh", "last_name" => "Goyal"); 

my $val = $obj->get_names(); 

print %$val; 

my $setName = $obj->set_names("kumar"); 

print "$setName \n"; 

我得到錯誤的

"Can't use string ("1") as a HASH ref while "strict refs" in use at class1.txt line 10." 
+0

另一個查詢:就像在「sub get_names」中一樣,我們聲明瞭$ self = @_,並且在調用腳本中我們傳遞的是$ obj-> get_names()。爲什麼在我們完成$ self = @_的時候沒有參數需要提供。 – Nitesh

+0

請不要更正問題中的代碼。如果你刪除了你的錯誤,我們的答案看起來很奇怪。如果您有關於您的代碼的新問題,請提出一個新問題。現在要求和回答這個問題。 – TLP

+0

這是我的錯。真對不起。下次不會發生 – Nitesh

回答

2

錯誤

"Can't use string ("1") as a HASH ref .. 

從該部分物品:

sub get_names { 
    my $self = @_; 

當一個陣列被放置在標量上下文,它返回其大小。既然你打電話與

$obj->get_names(); 

只有一個參數子傳遞,它是對象,所以@_包含1個參數,其大小爲1,因此在子get_names,變量$self設置爲1。因此錯誤。你可能應該做的是

my $self = shift; 

但是,那樣做什麼都不會做,因爲你從來沒有在你的構造函數中存儲這些名字。作爲mpapec說,你應該在構造子new

my $self = { @_ }; 

此外,在get_names中,您只需返回對象,這不是非常有用。您應該返回$self->{name}$self->{last_name}

+0

謝謝。但是這意味着什麼「但是,那麼這將不會做任何事情,因爲你從來沒有在你的構造函數中存儲名字。正如mpapec所說,你應該這樣做」 – Nitesh

+0

當你調用'new'時,你永遠不會在任何地方存儲參數。你只存儲了一個空的哈希引用{'''。 – TLP

+0

TLP我修改了代碼。 get_names正在工作,但現在set_names我給錯誤爲「使用未初始化的值$ setName串聯(。)或字符串在class1.txt 行15」。 – Nitesh