perl:从对象的函数中获取值

时间:2014-03-26 15:13:56

标签: perl function

所以我有一个带有变量(x,y)的类AClass,以及一个应该将两个对象作为同一个类的参数的函数,计算它们的x和y,并返回具有计算值的类的新实例。

package AClass;

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

sub getX {
    my $self = shift;
    return $self->{'x'};
}

sub getY {
    my $self = shift;
    return $self->{'y'};
}

sub addition {
    my ($c1, $c2) = @_;

    return new AClass(
        $c1->getX() + $c1->getX(), 
        $c1->getY() + $c2->getY() 
    );
}


my $a1 = AClass->new(6, 4);
my $a2 = AClass->new(4, 3);

my $val = AClass::addition(\$v1, \$v2);
say $val.getX();

我收到错误“无法调用方法”getX“on unblessed reference”。当我试图访问不是实数的对象的值时,我认为问题是另外的函数?

2 个答案:

答案 0 :(得分:5)

这里有很多问题。

  • 您使用的是$v1$v2,大概是指$a1$a2

  • 您正在将引用传递给这些对象,而不是对象本身

  • 您的addition方法会将$c1的X值添加到自身而不是X的值$c2

  • 您正在使用字符串连接运算符.而不是间接运算符->

  • 最好使用小写字母作为词汇标识符。大写字母通常保留给包名称等全局字符

您必须总是 use strictuse warnings位于您的计划顶部。在这种情况下,您会收到$v1$v2未被声明的事实的提醒。

此版本的代码可以正常使用

use strict;
use warnings;

package AClass;

sub new {
  my $class = shift;
  my ($x, $y) = @_;
  bless { x => $x, y => $y }, $class;
}

sub get_x {
  my $self = shift;
  $self->{x};
}

sub get_y {
  my $self = shift;
  $self->{y};
}

sub addition {
  my ($c1, $c2) = @_;
  AClass->new(
      $c1->get_x + $c2->get_x,
      $c1->get_y + $c2->get_y
  );
}

package main;

use feature 'say';

my $a1 = AClass->new(6, 4);
my $a2 = AClass->new(4, 3);

my $val = AClass::addition($a1, $a2);
say $val->get_x;

<强>输出

10

答案 1 :(得分:3)

您使用$v1代替$a1。始终使用use strict; use warnings;

此外,您无缘无故地参考了。

my $val = AClass::addition($a1, $a2);

以下内容也适用(尽管add)是一个更好的词:

my $val = $a1->addition($a2);