2010-10-23 19 views
5

Tengo este programa que no funciona como se esperaba. Ayuadame.¿Por qué mi loop de Perl está apagado al final?

Quiero imprimir un encabezado de fila.

Si la entrada es 4, quiero que se emita 1|2|3|4.

No funciona como todo, si codigo $count valor funciona parcialmente pero falta el último número.

sub printC { 
     my $count = @_; 
     # count = 4 # works partially only prints 1|2|3 
     for(my $i=1;$i<$count;$i++) { 
       print "$i|"; 
     } 
     print $i; 
} 
$count = 2; 
&printC($count); 
print "\n"; 

Respuesta

11

El problema está aquí:

my $count = @_; 

La asignación está sucediendo en un escalar contexto que asigna el número de elementos en la matriz @_-$count, que su caso es 1, como eres pasando el argumento 1 a la función.

Para solucionar este problema que puede hacer:

my ($count) = @_; 

o

my $count = $_[0]; 

Aquí hay otro problema:

for(my $i=1..... 
    ^^ 

Mediante el uso de my usted ha hecho $ilocales a el cuerpo de for y no estará disponible fuera de. Por lo tanto, su print final fuera del for no imprime nada. Para solucionar este movimiento la declaración de $i fuera del bucle:

sub printC { 
     my ($count) = @_; 
     my $i; 
     .... 

siempre que sea un punto para escribir

use strict; 

en la parte superior de su programa que le permite coger dichos errores.

La forma Perl de hacer lo que hace su función es:

print join('|',1..$count); 
+0

Supongo que haríamos un buen equipo de codificación sincronizada –

+0

Me gusta el modo Perl. – Tom

+0

Gracias por la mini lección. – user485167

1

$i no existe una vez que haya salido de la for bucle debido al lugar donde se declaró.

Usted podría hacer

sub printC { 
    my ($count) = @_; 
    my $i; 
    for ($i = 1; $i < $count; $i++) { 
     print "$i|"; 
    } 
    print $i; 
} 

aún más simple:

sub printC { 
    my ($count) = @_; 
    print join("|", 1 .. $count) . "\n"; 
} 
5

Un hacker de verdad Perl podría escribir algo como esto:

sub printC { 
    my $count = shift; 
    print join "|", (1 .. $count); 
} 

Una vez que entienda cómo funciona esto, se' Descubriré que has aprendido algo más sobre Perl.:-)

0

Otro bit de "ser más Perlish" es no utilizar el C-style for loop. Hay casi nunca necesidad de usar un estilo C for en Perl.

En lugar de

for(my $i=1;$i<$count;$i++) { ... } 

uso

for my $i (1 .. $count) { ... } 

Son casi equivalente, excepto la última versión es tanto más fácil de leer y más resistente a los errores off-by-one. (La razón de su código sólo estaba imprimiendo 1|2|3 en lugar de 1|2|3|4 se debe a que la prueba en su estilo de C for estaba comprobando $i<$count cuando debería haber sido $i<=$count -. Esto es un error muy común con for bucles de tipo C, que for (list) evita por completo)

Además, no prefija sus llamadas secundarias con &. Es un holdover de Perl 4 que ya no se necesita en Perl 5 y tiene efectos secundarios de los que probablemente no estés al tanto y que probablemente no desees. Simplemente use printC($count) en lugar de &printC($count).

Pero, sí, en este caso particular, join es probablemente un mejor enfoque que for de todos modos.

Cuestiones relacionadas