_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/map - pritaikyti pakeitimą sąrašui ir gauti naują sąrašą su pakeitimais
  • map BLOCK LIST
  • map EXPR,LIST

    Prilygina BLOCK arba EXPR kiekvienam LIST elementui (lokaliai nustatydamas $_ kiekvienam elementui) ir gražina sąrašo reikšmę kiekvienam tokiam prilyginimui. Skaliariniame kontekste, gražina viso sugeneruotų elementų skaičių. Prilygina BLOCK arba EXPR sąrašo kontekste, taigi kiekvienas LIST elementas gali duoti 0, 1 arba daugiau elementų gražinamoje reikšmėje.

        @chars = map(chr, @nums);

    verčia skaičių sąrašą į atitinkamus simbolius. O

        %hash = map { getkey($_) => $_ } @array;

    yra tiesiog smagus būdas, norint užrašyti

        %hash = ();
        foreach $_ (@array) {
    	$hash{getkey($_)} = $_;
        }

    Pažymėtina, kad $_ yra alias'as sąrašo reikšmei, taigi jis gali būti naudojamas pakeisti LIST elementus. Nors tia yra naudinga ir palaikoma, gali sukelti keistus rezultatus, jei LIST elementai nėra kintamieji. Naudojant paprastą foreach ciklą tam reikalui, būtų daug aiškiau daugumoj atvejų. Taip pat žr. grep masyvui, masyvui, sudarytam iš originalaus sąrašo, kuriame BLOCK arba EXPR prisilygino true elementams.

    { pradeda hash nuorodas ir blokus, taigi map { ... galėtų būti arba map BLOCK LIST arba map EXPR, LIST pradžia. Kadangi perlas nežiūri tolyn ir neieško uždaromojo }, jis turi spėti su kuriuo atveju susidūrė priklausomai nuo to, ką randa iškart po {. Dažniausia jis atspėja, bet jei ne, tuomet to ir nesupras, kol neatsitrenks į } ir pastebės trūkstamą (arba nesitikėtą) kablelį. Tokiu atveju bus raportuojams sintaksės klaidos netoli }, bet reikės ką nors pakeisti greta { kaip kad panaudoti unarinį +, kad pagelbėtume perlui:

        %hash = map {  "\L$_", 1  } @array  # perl spėja, kad tai  EXPR.  blogai
        %hash = map { +"\L$_", 1  } @array  # perl spėja kad tai BLOCK. gerai
        %hash = map { ("\L$_", 1) } @array  # irgi veikia
        %hash = map {  lc($_), 1  } @array  # ir čia.
        %hash = map +( lc($_), 1 ), @array  # tai EXPR ir jis veikia 
        %hash = map  ( lc($_), 1 ), @array  # prilygina (1, @array)

    arba priversti greitą hash'o konstruktorių panaudoti +{

       @hashes = map +{ lc($_), 1 }, @array # EXPR, taigi reikia , pabaigoje

    ir gausite anoniminių hash'ų sąrašą, kuriame visus bus tik po vieną įrašą.

algirdas@perl.lt 2005.04.11 - $dabar