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.

Comments Closed

7 Comments

  1. na, kasdienybė.. "bugo nebegalima tvarkyt, vartotojai priprato" :)

    .. o dažnai būna, vartai senus sourcus, "this is a workaround on <PHP/Swing/AWT/xxxFramework> bug, " (toliau kintamas dydis kodo eilučių), ir ant current sistemos – tiutiu… bugo nebera, kodas – broken.

    negalima taisyt bugų. čia mūsų gyvenimo dalis:] ne taip paprasta gerą bugą parašyt..

  2. tai dabar bus galima tik šitaip naudot?

    if( salyga ) { veiksmas; }

    nebegalima šitaip nuostabiai naudot?

    veiksmas if salyga;

    teisingai supratau? tuomet labai liūdna..

  3. Ne… Tik negalima tikėtis kad už sakinio ribų bus pasiekiami su "my" apsirašyti leksiniai kintamieji.

    Blogas kodas:

    my $foo = 1 if $bar; print $foo;

    Geras kodas:

    my $foo; $foo = 1 if $bar; print $foo;

  4. na PHP tai taip ir dabar yra [bugas]

    o Javoje ner tokio [bugo]

    nu vat, nebetures ir Perlas, sakyciau, i gera cia

Comments are closed.