Gleitender Mittelwert Aufrufsyntax

29/08/2013 - 12:35 von r_haertel | Report spam
Hallo,

mit folgender Funktion für einen gleitenden Mittelwert komme ich nicht klar.

sub sma ($) {
my ($period, $sum, @a) = shift, 0;
return sub
{
unshift @a, shift;
$sum += $a[0];
@a > $period and $sum -= pop @a;
return $sum / @a;
}
}


Wie soll die Funktion aufgerufen werden?

Mein erster Ansatz:

my $SUM;
my @DATA;
my $AVG = sma( 32, \$SUM, \@DATA, 12 );
printf( "%.3f", $AVG );

Fehler:
Too many arguments for main::sma at x.pl line 42, near "12 )"
Execution of x.pl aborted due to compilation errors.

Mein zweiter Ansatz:

my $SUM;
my @DATA;
my $AVG = sma( 32, \$SUM, \@DATA );
printf( "%.3f", $AVG );

Fehler:
Too many arguments for main::sma at x.pl line 42, near "@DATA )"
Execution of x.pl aborted due to compilation errors.


Im Prinzip denke ich Ansatz 1 sollte richtig sein, denn neben der Periode, der Summe und dem Array für die Speicherung der Werte muss noch der neue Wert übergeben werden, der dann in Array übernommen wird.

Vielen Dank

Rüdiger
 

Lesen sie die antworten

#1 Bjoern Hoehrmann
29/08/2013 - 13:09 | Warnen spam
* wrote in de.comp.lang.perl.misc:
mit folgender Funktion für einen gleitenden Mittelwert komme ich nicht klar.

sub sma ($) {
my ($period, $sum, @a) = shift, 0;
return sub
{
unshift @a, shift;
$sum += $a[0];
@a > $period and $sum -= pop @a;
return $sum / @a;
}
}

Wie soll die Funktion aufgerufen werden?



Nur mit dem Argument `$period`. Dann wird eine Funktion zurückgegeben
die ebenfalls aufgerufen werden muss, um Ergebnisse zu erhalten. Ein
einfacheres Beispiel wàre

sub make_plus_one_function {
return sub {
my ($arg) = @_;
return $arg + 1;
}
}

my $plus_one_function = make_plus_one_function();
print $plus_one_function->(10), "";
print $plus_one_function->(99), "";

Auf den ersten Blick sieht es so aus, als müssen die Elemente einzeln
an die von `sma` erzeugte Funktion übergeben werden.
Björn Höhrmann · mailto: · http://bjoern.hoehrmann.de
Am Badedeich 7 · Telefon: +49(0)160/4415681 · http://www.bjoernsworld.de
25899 Dagebüll · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/

Ähnliche fragen