2010-02-25 8 views
5

Ich bin relativ neu in Perl und ich möchte nicht die List::Utilmax Funktion verwenden, um den maximalen Wert eines bestimmten Arrays zu finden.Warum gibt meine Perl max() -Funktion immer das erste Element des Arrays zurück?

Wenn ich den folgenden Code teste, gibt es nur den ersten Wert des Arrays zurück, nicht das Maximum.

sub max 
{ 
    my @array = shift; 
    my $cur = $array[0]; 
    foreach $i (@array) 
    { 
     if($i > $cur) 
     { 
      $cur = $i; 
     } 
     else 
     { 
      $cur = $cur; 
     } 
    } 
    return $cur; 
    } 
+7

Jetzt, da Sie gelernt haben, max() zu implementieren, verwenden Sie List :: Util's max(). Es wird schneller sein und weniger Bugs haben. – Schwern

+0

Gibt es einen besonderen Grund, warum Sie Lists Utils 'max' nicht benutzen wollen/können? –

+4

Nur ein Tipp: 'else {$ cur = $ cur}' tut gar nichts, also entferne es. Variablen vergessen ihre Werte nicht, nur weil du sie diesmal nicht durch eine Schleife benutzt hast :) – hobbs

Antwort

8

Ersetzen

my @array = shift; 

mit

my @array = @_; 

@_ ist das Array alle Funktionsargumente enthält. shift greift nur das erste Funktionsargument und entfernt es von @_. Ändern Sie diesen Code und es sollte korrekt funktionieren!

+0

Das funktioniert, aber würde es dir etwas ausmachen, es zu erklären? Ich dachte, Sie übergeben Parameter über das Shift-Keyword ..? – lotsofsloths

+2

Mein Post wurde aktualisiert :) Übrigens sollten Sie auch 'foreach my $ i' (oder 'for my $ i', was dasselbe bedeutet - for und foreach sind austauschbar) die Variable $ i auf die gleiche Weise deklarieren Sie deklarieren @array und $ cur. – rjh

+4

Unterprogrammparameter werden im Array '@ _' übergeben. 'shift' entfernt den ersten Wert aus dem angegebenen Array und gibt ihn zurück - Aufruf von' shift' ohne Argumente bewirkt, dass es auf das Array '@ _' wirkt. –

2

Warum möchten Sie nicht etwas verwenden, das funktioniert?

Eine der Möglichkeiten, um solche Probleme zu lösen, ist das Debuggen Ihrer Datenstrukturen. Bei jedem Schritt drucken Sie die Daten, die Sie sehen müssen, wenn das, was Sie erwarten, tatsächlich dort ist. Das kann so einfach sein wie:

print "array is [@array]\n"; 

Oder für komplexe Datenstrukturen:

use Data::Dumper; 
print Dumper(\@array); 

In diesem Fall hätte man gesehen, dass @array nur ein Element hat, so muss es das Maximum sein.

Wenn Sie sehen möchten, wie Listenzuweisung und Subroutinenargumente funktionieren, lesen Sie Learning Perl.

+0

Ich nehme an, er versucht Perl Programmierung zu üben. Haben wir nicht irgendwann einmal unsere eigene Sortierfunktion geschrieben?:) – rjh

+0

Ich versuche nicht zu vermuten. Deshalb frage ich. :) –

2

Sie können schreiben, die Funktion als:

#!/usr/bin/perl 

use strict; use warnings; 

print max(@ARGV); 

sub max { 
    my $max = shift; 
    $max >= $_ or $max = $_ for @_; 
    return $max; 
} 

Allerdings wäre es weitaus effizienter sei es eine Referenz auf das Array übergeben und noch effizienter List::Util::max zu verwenden.

Verwandte Themen