在面向对象的perl中获得问题

时间:2013-09-28 10:36:33

标签: perl

我是OO 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;

并创建了一个.pl文件

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."

1 个答案:

答案 0 :(得分:2)

错误

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

来自这一部分:

sub get_names {
    my $self = @_;

当数组放入标量上下文时,它返回其大小。因为你用

来调用sub
$obj->get_names();

只传递一个参数,即对象,因此@_包含1个参数,其大小为1,因此在子get_names中,变量$self设置为因此错误。你可能应该做的是

my $self = shift;

但是,那不会做任何事情,因为你从未在构造函数中存储过这些名称。正如mpapec所说,你应该做

my $self = { @_ }; 

在构造函数子new中。

此外,在get_names中,您只需返回对象,这不是很有用。您应该返回$self->{name}$self->{last_name}