2012-05-31 25 views
10

Stavo guardando il codice perl in linea e mi sono imbattuto in qualcosa che non avevo mai visto prima e non riesco a scoprire cosa sta facendo (semmai).Doppie parentesi graffe in perl

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

Qualcuno sa cosa significano le doppie parentesi graffe?

+5

Non credo che facciano nulla. Penso che siano equivalenti ad aggiungere un altro blocco di codice nel blocco if. – gpojd

risposta

11

È un trucco solitamente utilizzato con do, vedere chapter Statement Modifiers in perlsyn.

Probabilmente l'autore voleva saltare fuori dal blocco con next o simili.

+0

Questo sembra essere cosa sta facendo il codice. L'ultima parola chiave è usata nel codice nel blocco if. Grazie! – Chris

4

In caso di if, essi sono probabilmente equivalenti a singoli parentesi (ma dipende da ciò che è all'interno del blocco e all'esterno if, cfr

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

). Ci sono motivi per usare doppie parentesi, tuttavia, con next o do, vedere perlsyn. Ad esempio, provate ad eseguirlo più volte:

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

E provare a sostituire le doppie parentesi con quelle singole.

+0

questo è un buon esempio. – ysth

0

Senza molto più codice, è difficile dire per cosa vengono utilizzati. Potrebbe essere un errore di battitura o potrebbe essere un blocco nudo, vedere chapter 10.4 The Naked Block Control Structure in Learning Perl.

Un blocco nudo aggiunge lo scope lessicale alle variabili all'interno del blocco.

+0

Il primo set di parentesi dopo il 'if' non fornisce già quell'ambito? Perché nidificare? Sono per lo più ignorante di Perl, quindi forse è ovvio per le persone, ma non per me! –

+2

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

+0

Aggiungendo il secondo scope, è possibile riassegnare' $ var' e usarlo nel blocco naked in un modo che non è visibile al di fuori del blocco if. –

14

Ci sono due dichiarazioni lì. Una dichiarazione "se" e uno bare block. I blocchi nudi sono cicli che vengono eseguiti esattamente una volta.

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

# Outputs a b c 

Ma essendo loop, essi influenzano next, last e 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 fa lo stesso last poiché non v'è alcun elemento successivo.)

Essi sono di solito utilizzati per creare un ambito lessicale.

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. 

Non è chiaro il motivo per cui è stato utilizzato qui.


In alternativa, potrebbe anche essere un costruttore di hash.

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

è l'abbreviazione di

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

Perl fa capolino nelle parentesi di indovinare se si tratta di un ciclo di nudo o un costruttore di hash. Dato che non hai fornito il contenuto delle parentesi graffe, non possiamo dirlo.

+1

+1 per menzionare la possibilità di un costruttore di hash. – chepner

0

Il {{può essere utilizzato per uscire da un "blocco se".Ho del codice che 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 
Problemi correlati