2010-07-14 9 views
6

Esto parece muy simple, pero me está resultando difícil descubrirlo ya que soy nuevo en Perl. He estado revisando mucha documentación sobre bucles y todavía estoy perplejo por esto ... tener un sub que contiene un ciclo while y quiero usar un valor de variable dentro del ciclo fuera del ciclo (después de que el ciclo se haya ejecutado), sin embargo, cuando intento imprimir la variable, o devolverla desde el sub, no funciona, solo cuando imprimo la variable desde el bucle funciona ... Agradecería cualquier consejo sobre lo que estoy haciendo mal.Perl, utilizando la variable desde adentro While while fuera del ciclo?

no funciona (no imprime $ prueba):

sub testthis {  
    $i = 1; 
    while ($i <= 2) {  
     my $test = 'its working' ;  
     $i++ ; 
    } 
    print $test ; 
} 

&testthis ; 

Obras, impresiones $ ensayo:

sub testthis { 
    $i = 1; 
    while ($i <= 2) { 
     my $test = 'its working' ; 
     $i++ ; 
     print $test ; 
    } 
} 

&testthis ; 
+0

'$ i = 1;' probablemente debería ser 'my $ i = 1;', como está ahora, estás hablando con la variable '$ i' en el alcance externo que será una fuente de errores tan pronto como comience a llamar subrutinas desde otras subrutinas. Lo más probable es que '$ i' ni siquiera se declare en el ámbito externo, en cuyo caso usted está hablando con la variable del paquete. Si se ejecuta bajo 'use strict; use advertencias; 'entonces el pragma 'strict' hubiera arrojado un error sobre la variable no declarada. –

Respuesta

9

Declaras prueba variable dentro del bucle, por lo que es el ámbito loop, tan pronto como abandone el ciclo, la variable ya no se declarará.
Agregue my $test; solo entre $i=1 y while(..) y funcionará. El alcance ahora será el sub completo en lugar de solo el ciclo

+2

ahh ok, ahora lo entiendo ... gracias ... los tutoriales que he estado viendo son demasiado básicos para siquiera haber mencionado esto, supongo que debería ir directamente a las páginas de manualidades de Perl a partir de ahora – Rick

5

Coloque my $test antes del ciclo while. Tenga en cuenta que solo contendrá el último valor asignado en el ciclo while. ¿Es eso lo que buscas?

// will print "it's working" when 'the loop is hit at least once, 
// otherwise it'll print "it's not working" 
sub testthis { 
    $i = 1; 
    my $test = "it's not working"; 

    while ($i <= 2) { 
     $test = "it's working"; 
     $i++ ; 
    } 
    print $test ; 
} 
3

puede probar esto:

sub testthis { 
my $test 
$i = 1; 
while ($i <= 2) { 

$test = 'its working' ; 

$i++ ; 

print $test ; 
} 

} 

& testthis;

Nota: siempre que escriba código perl, es mejor agregar use strict; y use warning al principio del código.

+1

+1 por mencionar 'use strict'. – Abel

Cuestiones relacionadas