Perl的地图功能与OO perl

Mad*_*gan 2 oop perl

在Perl对象的方法中,我想在变量列表上调用另一个方法.像这样使用地图不起作用:

($open, $high, $low, $close) 
    = map( $self->adjust_for_factor, ($open, $high, $low, $close) );
Run Code Online (Sandbox Code Playgroud)

....

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

    return $price *  $self->get_factor ;
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,但它的丑陋和不规模.我确定必须可以在这里使用地图:

($open, $high, $low, $close) 
= (  $self->adjust_for_factor($open)
, $self->adjust_for_factor($high)
, $self->adjust_for_factor($low)
, $self->adjust_for_factor($close) );
Run Code Online (Sandbox Code Playgroud)

我想这是一个以正确的方式引用自我的问题.我无法概念化它们如何组合在一起.

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

Eug*_*ash 7

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

($open, $high, $low, $close)    
    = map $self->adjust_for_factor($_), $open, $high, $low, $close;
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

  • 如果你修改方法以便它可以接受一个列表,你应该在用一个参数调用时跳过`map`,这样它就会在标量上下文中返回一个带有一个参数的合理的东西.`return $ self-> get_factor*$ prices [0] if @prices == 1;`或类似的东西. (2认同)