2011-08-23 57 views
2

在Perl对象的方法中,我想调用变量列表中的另一个方法。使用地图像这样不起作用:Perl的映射函数OO perl

($open, $high, $low, $close) 
    = map($self->adjust_for_factor, ($open, $high, $low, $close)); 

....

sub adjust_for_factor { 
    my $self = shift; 
    my $price = shift; 

    return $price * $self->get_factor ; 
} 

这工作,但它的丑陋和不结垢。我敢肯定它必须可以在这里使用地图:

($open, $high, $low, $close) 
= ( $self->adjust_for_factor($open) 
, $self->adjust_for_factor($high) 
, $self->adjust_for_factor($low) 
, $self->adjust_for_factor($close)); 

我想这是一个以正确的方式引用自我的问题。我很难概念化它们如何融合在一起。

感谢所有花时间考虑/留下反馈的人。

+4

你忘了'$ _'。 – tchrist

回答

7

正如@tchrist所说,您忘记了将$_传递给您的方法。正确的方法是

($open, $high, $low, $close)  
    = map $self->adjust_for_factor($_), $open, $high, $low, $close; 

您还可以修改方法,以便它可以接受一个列表:

sub adjust_for_factor { 
    my ($self, @prices) = @_; 

    return map $_ * $self->get_factor, @prices; 
} 

($open, $high, $low, $close)  
    = $self->adjust_for_factor($open, $high, $low, $close); 
+2

如果您修改该方法以使其可以接受列表,则应该在使用一个参数调用时跳过'map',以便在标量上下文中返回一个具有一个参数的明智事物。 'return $ self-> get_factor * $ prices [0] if @prices == 1;'或类似的东西。 –

4

你忘了一个参数传递给你的对象的方法(帽尖tchrist),这里的工作示例:

$ cat l1.pl 
use strict; 
package p; 

sub new { return bless({factor => $_[1]}, $_[0]); } 
sub get_factor { return $_[0]->{factor}; } 
sub adjust_for_factor { 
    my ($self, $price) = @_; 
    return $price * $self->get_factor; 
} 

package main; 

my $obj = p->new(3); # Don't use "self" for object name outside object's class! 
my @res = map ($obj->adjust_for_factor($_), qw(1 2 3)); 
print join(", ", @res) . "\n"; 

$ ./l1.pl 
3, 6, 9 
2
($open, $high, $low, $close) = 
    map $self->adjust_for_factor, $open, $high, $low, $close; 

应该

($open, $high, $low, $close) = 
    map $self->adjust_for_factor($_), $open, $high, $low, $close; 

可缩短至

$_ = $self->adjust_for_factor($_) 
    for $open, $high, $low, $close;