use strict; use warnings; # 'state' declară o variabilă lexicală (similar cu my), # dar care își păstrează valoarea între apeluri. # Este, practic, o variabilă statică, exact ca în C sau C++. # # my → variabilă lexicală, resetată la fiecare intrare în bloc. # state → variabilă lexicală, persistentă între apeluri. # local → variabilă globală cu valoare temporar modificată. # EXEMPLUL 1. # Un contor într-o subrutină, varianta cu my # De fiecare dată $x este recreat. sub counter_a { my $x = 0; $x++; return $x; } print counter_a(); # 1 print counter_a(); # 1 print counter_a(); # 1 # Un contor într-o subrutină, varianta cu state # Acum $x este inițializat o singură dată și persistă. use feature 'state'; sub counter_b { state $x = 0; $x++; return $x; } print counter_b(); # 1 print counter_b(); # 2 print counter_b(); # 3 # EXEMPLUL 2. # 'state' este într-un bloc (nu doar în subrutine) # pentru că un bloc este o expresie cu domeniu (scope) lexical. # Variabila $sum există în bloc, dar persistă și între iterații. for (1..3) { state $sum = 0; $sum += $_; print "$sum\n"; } # EXEMPLUL 3. # 'state' într-un bloc folosit ca expresie, # aici se poate vedea combinația dintre blocuri‑expresie și state. # expensive_computation() se execută o singură dată, # chiar dacă expresia este evaluată de mai multe ori. my $value = do { state $cache; $cache //= expensive_computation(); }; # EXEMPLUL 4. # 'state' în combinație cu closures (încheierea unei subrutine) # Fiecare closure are propriul său state. sub make_counter { return sub { state $x = 0; return ++$x; }; } my $c1 = make_counter(); my $c2 = make_counter(); print $c1->(); # 1 print $c1->(); # 2 print $c2->(); # 1