2012-05-31 18 views
10

Estaba mirando el código perl en línea y me encontré con algo que no había visto antes y no puedo averiguar qué está haciendo (en todo caso).llaves dobles en perl

if($var) {{ 
    ... 
}} 

¿Alguien sabe lo que significan los apoyos dobles rizado?

+5

No creo que hagan nada. Creo que son equivalentes a agregar otro bloque de código en el bloque if. – gpojd

Respuesta

11

Es un truco generalmente empleado con do, ver chapter Statement Modifiers in perlsyn.

Probablemente el autor quería saltar fuera de la cuadra con next o similar.

+0

Esto parece ser qué está haciendo el código La última palabra clave se usa en el código en el bloque if. ¡Gracias! – Chris

4

En caso de if, que son probablemente equivalentes a los apoyos individuales (pero depende de lo que hay dentro del bloque y fuera de la if, cf.

perl -E ' say for map { if (1) {{ 1,2,3,4 }} } 1 .. 2' 

). Sin embargo, hay razones para usar llaves dobles con next o do, vea perlsyn. Por ejemplo, intente ejecutar esta operación varias veces:

perl -E 'if (1) {{ say $c++; redo if int rand 2 }}' 

Y tratar de sustituir los apoyos dobles con los solos.

+0

ese es un buen ejemplo. – ysth

0

Sin mucho más código, es difícil decir para qué se utilizan. Podría ser un error tipográfico, o podría ser un bloque desnudo, vea chapter 10.4 The Naked Block Control Structure in Learning Perl.

Un bloque desnudo agrega alcance léxico a las variables dentro del bloque.

+0

¿El primer conjunto de llaves después del 'si' ya no proporciona ese alcance? ¿Por qué anidar? En gran parte soy ignorante de Perl, así que tal vez sea obvio para la gente, ¡pero no para mí! –

+2

@ChrisFarmer: porque 'if (1) {{my $ x = 1; } {my $ x = 2; }} ' – choroba

+0

Al agregar el segundo ámbito, puede reasignar' $ var' y usarlo en el bloque desnudo de una manera que no sea visible fuera del bloque if. –

14

Hay dos declaraciones allí. Una declaración "if" y un bare block. Los bloques desnudos son bucles que se ejecutan exactamente una vez.

say "a"; 
{ 
    say "b"; 
} 
say "c"; 

# Outputs a b c 

Pero ser bucles, que influyen next, last y redo.

my $i = 0; 
say "a"; 
LOOP: { # Purely descriptive (and thus optional) label. 
    ++$i; 
    say "b"; 
    redo if $i == 1; 
    say "c"; 
    last if $i == 2; 
    say "d"; 
} 
say "e"; 

# Outputs a b b c e 

(next hace lo mismo que last ya que no hay elemento siguiente.)

Se utilizan por lo general para crear un ámbito léxico.

my $file; 
{ 
    local $/; 
    open(my $fh, '<', $qfn) or die; 
    $file = <$fh>; 
} 
# At this point, 
# - $fh is cleared, 
# - $fh is no longer visible, 
# - the file handle is closed, and 
# - $/ is restored. 

No está claro por qué se utilizó aquí.


Alternativamente, también podría ser un constructor hash.

sub f { 
    ... 
    if (@errors) { 
     { status => 'error', errors => \@errors } 
    } else { 
     { status => 'ok' } 
    } 
} 

es la abreviatura de

sub f { 
    ... 
    if (@errors) { 
     return { status => 'error', errors => \@errors }; 
    } else { 
     return { status => 'ok' }; 
    } 
} 

Perl se asoma en las llaves de adivinar si se trata de un bucle completo o en un constructor de hash. Como no proporcionó el contenido de los aparatos ortopédicos, no podemos decirlo.

+1

+1 por mencionar la posibilidad de un constructor hash. – chepner

0

El {{se puede utilizar para salir de un "bloque si".Tengo un código que contiene:

if ($entry =~ m{\nuid: ([^\s]+)}) {{ # double brace so "last" will break out of "if" 
    my $uid = $1; 
    last if exists $special_case{$uid}; 
    # .... 

}} 
# last breaks to here