एक पर्ल ऑब्जेक्ट की विधि के भीतर मैं चर की सूची पर एक और विधि कॉल करना चाहता हूं। इस तरह से मानचित्र का उपयोग करने से काम नहीं चलता:

($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) );

मुझे लगता है कि यह स्वयं को सही तरीके से संदर्भित करने का मुद्दा है। मुझे यह समझने में परेशानी हो रही है कि यह सब एक साथ कैसे फिट बैठता है।

उन सभी को धन्यवाद जिन्होंने विचार करने/प्रतिक्रिया देने के लिए समय निकाला।

2
MadMaardigan 23 अगस्त 2011, 16:53

3 जवाब

सबसे बढ़िया उत्तर

जैसा कि @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);
7
Eugene Yarmash 23 अगस्त 2011, 17:20
2
यदि आप विधि को संशोधित करते हैं ताकि यह एक सूची को स्वीकार कर सके, तो आपको map को एक तर्क के साथ बुलाए जाने पर छोड़ देना चाहिए ताकि यह स्केलर संदर्भ में एक तर्क के साथ एक समझदार चीज़ लौटाए। return $self->get_factor * $prices[0] if @prices == 1; या ऐसा ही कुछ।
 – 
Eric Strom
23 अगस्त 2011, 19:39

आप अपने ऑब्जेक्ट की विधि (टोपी टिप 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
4
DVK 23 अगस्त 2011, 17:31
($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;
3
ikegami 23 अगस्त 2011, 22:08