Perl klaida

Pastarąją savaitę Perl susirašinėjimo sąrašuose labai aštriai diskutuojama viena Perl klaida, kuri ką tik buvo ištaisyta. Kai kurie sako, kad tai visai ne klaida, kad viskas turėtų būti palikta kaip ir buvo. Na, gal kas galit pasakyti, kur čia klaida šitame sakinyje:

my $foo = 1 if $bar;

Problema yra tame, kad $foo yra leksinis kintamasis, ir nelabai aišku, kaip apibrėžti jo galiojimo sritį. Jeigu tą patį perrašysime kitaip, tai srities ribos žymiai paaiškės:

if ($bar) {
      my $foo = 1;
}

Iš čia paaiškėja, jog priskyrimas my $foo = 1; yra visiškai bevertis, nes $foo yra vietinis (leksinis) kintamasis, kurio galiojimas pasibaigia tuoj už figūrinių skliaustelių užsidarymo. Bet čia ir yra visa klaida, nes iki šiol jo galiojimas nebuvo užbaigiamas čia pat:

[petras@lietuvoje ~]$ perl -Mstrict -wle 'my $bar = 1; my $foo = 1 if $bar;
print $foo;'
1

…kai Perlas turėtų pasiskųsti, kad bandoma pasiekti nenustatytą kintamąjį.

Dabar ši klaida pataisyta, bet audros nerimsta, nes pasirodo nemažai kodo priklauso nuo šitos klaidos.