2010-02-25 20 views
5

Soy relativamente nuevo en Perl y no quiero utilizar la función List::Utilmax para encontrar el valor máximo de una matriz determinada.¿Por qué mi función Perl max() siempre devuelve el primer elemento de la matriz?

Cuando pruebo el código siguiente, simplemente devuelve el primer valor de la matriz, no el máximo.

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

Ahora que ha aprendido a implementar max(), use el max() de List :: Util. Será más rápido y tendrá menos errores. – Schwern

+0

¿Alguna razón en particular por la cual no quiere/no puede usar el 'máx' de List :: Util? –

+4

Solo un consejo: 'else {$ cur = $ cur}' no hace nada, así que quítelo. Las variables no olvidan sus valores solo porque no los usaste esta vez a través de un bucle :) – hobbs

Respuesta

8

Reemplazar

my @array = shift; 

con

my @array = @_; 

@_ es la matriz que contiene todos argumentos de la función. shift solo toma el primer argumento de función y lo elimina de @_. ¡Cambia ese código y debería funcionar correctamente!

+0

Esto funciona, pero ¿te importaría explicarlo? Pensé que pasar parámetros a través de la palabra clave shift ...? – lotsofsloths

+2

Actualicé mi publicación :) Por cierto, también deberías hacer 'foreach my $ i' (o 'por mi $ i', lo que significa lo mismo - para y foreach son intercambiables) para declarar explícitamente la variable $ i de la misma manera declaras @array y $ cur. – rjh

+4

Los parámetros de subrutina se pasan en la matriz '@ _'. 'shift' quita el primer valor de la matriz especificada y lo devuelve - al llamar' shift' sin argumentos hace que actúe sobre la matriz '@ _'. –

2

¿Por qué no quieres usar algo que funciona?

Una de las formas de resolver problemas como este es depurar las estructuras de datos. En cada paso, imprime los datos que tiene que ver si lo que espera es realmente allí. Esto puede ser tan simple como:

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

O para estructuras de datos complejas:

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

En este caso, habría visto que @array tiene sólo un elemento, por lo que debe ser el máximo.

Si desea ver cómo funcionan los argumentos de asignación de lista y subrutina, consulte Learning Perl.

+0

Supongo que está tratando de practicar la programación de Perl. ¿No hemos escrito todos nuestra propia función de clasificación en algún momento?:) – rjh

+0

Intento no asumir. Es por eso que pregunto. :) –

2

Se puede escribir la función como:

#!/usr/bin/perl 

use strict; use warnings; 

print max(@ARGV); 

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

Sin embargo, sería mucho más eficiente que pasar una referencia a la matriz y aún más eficiente de utilizar List::Util::max.

Cuestiones relacionadas