_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/split - išskaidyti string'ą, naudojant regexp atskyrėją

  • split /PATTERN/,EXPR,LIMIT
  • split /PATTERN/,EXPR
  • split /PATTERN/
  • split

    Padalija eilutę EXPR ir gražina sąrašą eilučių. Pagal nutylėjimą, tušti laukai, esantys pradžioje eilutės, yra paliekami, o besitesiantys kitose eilutės vietose (trailing) - ištrinami. (Jei visi laukai tušti, jie taip pat ištrinami.)

    Skaliariniame kontekste, gražina rastų laukų skaičių ir vykdo padalinimą į @_ masyvą. Tačiau skaliariniame kontekste split funkcijos naudojimas nepatartinas, nes sugadina paprogramės argumentus.

    Jei EXPR praleistas, skaido $_ eilutę. Jei PATTERN taip pat praleistas, išdalina naudodamas whitespace'us (prieš tai praleisdamas bet kokius tarpus, einančius pradžioje). Bet kas, įrašyta kaip PATTERN naudojamas kaip simbolis(ai), atskiriantys laukus. (Pažymėtina, kad atskyrėjas gali būti ilgesnis nei vienas simbolis).

    Jei LIMIT nurodytas teigiamas, jis nurodo maksimalų laukų, į kuriuos bus išskaidytas EXPR, skaičių, nors tikrasis gražinamų laukų skaičius priklauso nuo to, kiek kartų PATTERN atitinka EXPR viduje. Jei LIMIT nenurodytas arba nurodytas nulis, tušti besikartojantys laukai, panaikinami (pop funkcija galimiems vartotojams tiktų kad geriau prisiminti). Jei LIMIT neigiamas, laikoma, jog jis parenkamas pakankamai didelis. Pažymėtina, kad skaidant EXPR kuris yra tuščias, gražinamas tuščias sarašas, nepaisant nurodyto LIMIT.

    Pattern'as, aprašantis tuščią eilutę (nemaišyti su nuliniu pattern'u // , kuris yra tik vienas raštų, reiškiančių tuščią eilutę) išskaidys EXPR atskirais simboliaisž Pvz.:

        print join(':', split(/ */, 'hi there'));

    išveda 'h:i:t:h:e:r:e'.

    Naudojant tuščią raštą (pattern) // konkrečiai nurodo tuščią eilutę ir neturėtų būti painiojamas su // , reiškiančiu "paskutinį rašto (pattern) atitikimą".

    Tušti laukai (pradžioje ar pabaigoje) kai yra daugiau nei nulis pločio atitikimų eilutės pradžioje (ar pabaigoje); nulinio pločio atitikmuo, rastas pradžioje (ar gale) eilutės, neduoda rezultate tuščio lauko. Pvz:

       print join(':', split(/(?=\w)/, 'hi there!'));

    duoda išvedimą 'h:i :t:h:e:r:e!'.

    LIMIT parametras gali būti panaudotas skaidant eilutę tik iš dalies

        ($login, $passwd, $remainder) = split(/:/, $_, 3);

    Kai eina kalba apie sarašus, jei LIMIT yra praleistas ar nulis, Perl priskiria jam skaitmenį, vienu didesnį nei kintamųjų skaičius saraše, siekiant išvengti bereikalingo darbo. Pvz. sarašui paskutiniame pavyzdyje LIMIT pagal nutylėjimą būtų 4. Svarbiausia pritaikymo nauda yra ta, jog neleidžiama padalintui eilutės į daugiau laukų nei reikia.

    Jei PATTERN panaudoti skliaustai, papildomi sarašo elementai yra sukuriami iš kiekvieno substringo, atitinkančio atskyrėją.

        split(/([,-])/, "1-10,20", 3);

    rezultate gauname:

        (1, '-', 10, ',', 20)

    Jei turimas visas normalios Unix elektroninio pašto žinutės headeris kintamąjame $header, jį galima išskaidyti į atskiras reikšmes taip:

        $header =~ s/\n\s+/ /g;  # ištaiso besitęsiančias eilutesfix continuation lines
        %hdrs   =  (UNIX_FROM => split /^(\S*?):\s*/m, $header);

    Raštas /PATTERN/ gali būti pakeistas išsireiškimu, nusakančiu raštus, galimus vykdymo metu. (Norint padaryti kompiliaciją vykdymo metu tik vienąkart, naudoti/$variable/o .)

    Kaip specialus atvejis, aprašant PATTERN kaip tarpą (space)(' ') išskaidys eilutę taip pat kaip ir split be jokių argumentų. Taigi, split(' ') gali būti panaudojamas emuliuoti awk'o elgseną, o split(/ /) duos tiek tuščių laukų, kiek jų yra eilutės pradžijoe.split /\s+/ yra tarsi split(' ') išskyrus tai, kad bet koks space'as, einantis pradžioje, rezultate duos tuščią pirmąjį lauką. split be jokių argumentų iš tikrųjų atliekasplit(' ', $_) viduje.

    PATTERN /^/ laikomas toks pat, kaip ir būtų /^/m , kadangi kitaip, nėra daug naudos.

    Pavyzdys:

        open(PASSWD, '/etc/passwd');
        while (<PASSWD>) {
            chomp;
            ($login, $passwd, $uid, $gid,
             $gcos, $home, $shell) = split(/:/);
    	#...
        }

    Kaip ir su regular pattern matching, bet kurie fiksuojantys skliaustai, kurie neturi atitikmens split() bus gražinti kaip undef :

        @fields = split /(A)|B/, "1A2B3";
        # @fields yra (1, 'A', 2, undef, 3)
algirdas@perl.lt 2005.04.11 - $dabar