在Perl中,如何确保从同一对象的方法中调用sub作为方法?

时间:2011-10-11 15:21:07

标签: perl

我有一个具有新方法的类,并使用该对象调用方法X.当我从对象调用X时,参数的第一个值是$ self,其余的是我发送的值。现在当我从对象上的另一个方法调用相同的方法,第一个值不再是$ self,而只是发送的值。如何解决这种情况?

样品:

my $p = TEST->new;
$p->mymethod(1,2,3);  # @_ = 'self, 1, 2, 3'

但如果在'mymethod'中被其他方法调用:

sub anothermethod{
  my ($self, $a) = @_;
  mymethod(1,2,3);  # @_ = '1,2,3'  
}

如何编写'mymethod'以便处理这两种情况?或者我从根本上做错了什么?

2 个答案:

答案 0 :(得分:9)

就像你这样做:

$p->mymethod(1,2,3);

你需要明确你正在调用方法的对象(甚至是在类中):

$self->mymethod(1,2,3);

答案 1 :(得分:2)

这不是一个好主意(你应该决定子程序是否是一种方法,并以一致的方式使用它),但在弱点时刻,我使用了如下结构:

sub subroutine_that_may_get_called_like_a_method {
    shift if ref $_[0] eq __PACKAGE__;
    my ($param1, $param2) = @_;
    ...
}

sub method_that_may_get_called_like_a_subroutine {
    unshift @_, __PACKAGE__ if ref $_[0] ne __PACKAGE__
    my ($self, $param1, $param2) = @_;
    ...
}

通常我只能盯着这个代码几个小时才能在我的肠道中羞辱池,我必须解决它。