Perl, duchschnitt eines Arrays in einer subroutine berechnen [gelöst]

rusty-spoon

New member
Hallo alle zusammen,

Ich versuche nun seit gestern Abend den Durchschnitt einer beliebigen Anzahl von Werten in einem Array zu berechnen. Nach einiger Zeit mit diversen Tutorials und Google hab ich einen Weg gefunden:

Code:
Werte im Array @ips:

1.5 0.9 1.2


Nun möchte ich das, da die Anzahl der Werte im Array varieren können und ich das mit insgesamt 3 Arrays durchführen möchte, an eine Subroutine weitergeben:

#######################################
my $ipsDurch = Durchschnitt(@ips);
print $ipsDurch;

sub Durchschnitt {
  my $array_ref=$_[0];

  # Array leer? Dann Durchschnitt 0
  if(@$array_ref == 0) { return 0 };

  my $summe=0;

  for(my $i=0;$i<=$#{$array_ref};$i++) {
    $summe+=$$array_ref[$i];
  }

  return $summe/@$array_ref;
}
#######################################

Die Subroutine gibt mir nun aber immer:

Can't use string ("1.5") as an ARRAY ref while "strict refs" in use at data.pl line 86.

muss ich den Wert umwandeln?

Achja die Werte kommen über eine Textdatei ins Script, werden bearbeitet bis sie nur noch die Zahlenwerte haben und die Einheiten werden einfach abgeschnitten
was mach ich falsch? Ich hoffe das sing genug Infos damit ihr mir helfen könnt, wenn nicht liefer ich gerne nach.

achja ich verwende im Script auch die Anweisung "use strict;"

vielen Dank im vorraus

rusty
 

metax.

New member
Du musst ein bißchen aufpassen.
Wenn du der Methode ein Array übergibst, werden die Arraywerte mit dem Parameterarry zusammengefügt.
Z.B.
Code:
@array = ( 1, 2, 3);
methode(@array);
// Äquivalent zu:
methode(1,2,3);
// und:
methode(@array, 5);
// Äquivalent zu
methode(1,2,3,5);
Du kannst also das ganze Parameterarray einfach in der Funktion abgreifen und durch eine For-Schleife bzw. Foreach-Schleife bzw. Map laufen lassen:

Code:
#!/usr/bin/perl -w

use strict;
use warnings;

my @array = (1, 2, " 3 ", 4.0 , " 6.00 " ); // Wird alles zu Gleitkommazehal konvertiert, wenn es soweit ist ...

print durchschnitt(@array) . "\n";   // Ergibt (1 + 2 + 3 + 4 + 6) / 5 = 3.2

sub durchschnitt {
        my $sum = 0, my $num = 0; // Lokale Variablen
        map { $sum += $_; $num++;  } (@_); // Ist quasi eine foreach-schleife in Kurzform, @_ = Parameterarray
        return $num ? ($sum / $num) : 0; // Falls $num = 0, dann gib 0 zurück, sonst $sum / $num
}
mfg, metax.

edit: Diese FUnktion kann dir vllt. noch hilfreich sein:
http://www.mathe2.uni-bayreuth.de/perl/EP/map.htm
 

rusty-spoon

New member
danke, dein Code funktioniert Super.

Den Link werd ich mir jetzt erstmal zu Gute führen. Die Funktion map sieht recht nützlich aus werde ich bestimmt in Zukunft nochmal drauf zurück greifen.

Dank dir
rusty
 
Oben