use strict; use warnings; # În diverse limbaje de programare, un bloc este un set de instrucțiuni grupate # și tratate ca o singură unitate. Blocurile sunt folosite pentru a defini # domeniul de aplicare al variabilelor, a controla fluxul de execuție în # cadrul instrucțiunilor condiționale și bucle/iterații # și a încapsula codul în funcții, metode sau clase. Perl nu face excepție de la # aceste reguli. Astfel, cele mai comune utilizări sunt pentru: # definirea unui domeniu de vizibilitatea și accesibilitatea variabilelor, # declarații condiționale (if), bucle/iterații (while, for), funcții/subrutine (sub), # definirea unei clase în programarea orientată pe obiecte (conține atribute și metode), # În Perl, un bloc este o secțiune de cod cuprinsă între acolade {}. # Acestea definesc un domeniu de aplicare, unde instrucțiunile cuprinse # între {...} sunt tratate unitar (o singură entitate). Blocurile ajută la: # organizarea codului, controlul fluxului de execuție, # definirea vizibilității și a duratei de viață a variabilelor dintr-un program. # Dar, în Perl, un bloc {...} nu este limitat doar la o structură de control, # acesta poate fi folosit și ca o valoare exact ca o expresie. # Această particularitate îl apropie de limbajele funcționale. # Un bloc {...} este o expresie care returnează ultima valoare evaluată în interiorul lui. # Acest aspect înseamnă că poate fi folosit oriunde există o valoare: # într-o atribuire, într-un print, într-un %hash, într-o @listă, # într-un operator ternar, oriunde. # EXEMPLUL 1. # Bloc folosit ca expresie într-o atribuire. # Se poate observa că: # blocul este o expresie, iar ultima linie determină valoarea blocului. # do {...} este opțional, dar recomandat pentru claritate. Devine însă # obligatoriu în cazul implementării use strict. my $x = do { my $a = 10; my $b = 20; $a + $b; # ultima expresie = valoarea blocului }; print 'Variabila $x este: ',"$x\n"; # 30 # EXEMPLUL 2. # Bloc folosit într-un print # Blocul produce un șir de caractere, iar print îl afișează. print do { my $t = localtime(); "Ora curentă este: $t\n"; }; # EXEMPLUL 3. # Bloc folosit pentru inițializarea unui %hash my %h = ( start => 1, middle => do { my $x = 5; $x * 3; }, end => 99, ); print "start: $h{start}\n"; print "middle: $h{middle}\n"; # 15 print "end: $h{end}\n"; # EXEMPLUL 4. # Bloc folosit ca operator ternar "mai puternic". # În acest caz blocurile permit cod multi-linie în ramurile ternarului. my $result = my $flag ? do { my $x = compute(); $x + 10; } : do { warn "Flag is false"; 0; }; # EXEMPLUL 5 # Blocuri anonime folosite pentru inițializări complexe # Blocul produce direct conținutul fișierului. my $config = { version => 1, data => do { open (my $fh,"<","blocks_implementation.txt") or die $!; local $/ = undef; my $content = <$fh>; close($fh); $content; }, }; print "$config->{version}\n"; print "$config->{data}"; # EXEMPLUL 6 # Blocuri în @liste/@array my @values = ( 1, 2, do { my $x = 10; $x * 2; }, 5 ); print "@values"; # 1 2 20 5 #CONCLUZIE: # Blocurile {...} în Perl nu sunt doar structuri de control. # Ele sunt expresii cu valoare, care: # - pot fi folosite oriunde este necesară o valoare. # - returnează ultima expresie. # - creează un domeniu (scope) lexical. # - permit inițializări complexe, cod multi-linie și logică elegantă.