_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/sprintf - sutvarkytas išvedimas į string'ą

  • sprintf FORMAT, LIST

    Gražina eilutę, sutvarkytą pagal įprastines C bibliotekos funkcijos sprintf, printf sąlygas . Žiūrėti žemiau dėl daugiau detalių, o taip pat sprintf(3) ar printf(3) savo sistemoje pagrindinių principų paaiškinimams.

    Pavyzdžiui:

            # Sutvarkyti skaičių su iki 8 pradžioje einančių nulių
            $result = sprintf("%08d", $number);
            # Suapvalinti skaičių iki 3 skaitmenų po kablelio
            $rounded = sprintf("%.3f", $number);

    Perl daro savo paties sprintf tvarkymą - jis emuliuoja C funkciją sprintf, bet jos nenaudoja (išskyrus slankiojančio kablelio skaičiams ir tik tada įmanomi tik standartiniai modifikatoriai). Rezultate, bet kokie nestandartiniai plėtinia lokaliame sprintf negalimi iš Perl.

    Skirtingai nei printf, sprintf neatlieka to, ko dažniausiai norima kai perduodama jam masyvas kaip pirmas argumentas. Masyvui suteikiamas skaliarinis kontekstas ir vietoj to, kad naudotų 0-nį masyvo elementą tvarkymui, Perl elementų sumą masyve kaip formatą, kas beveik niekada nebūna naudinga.

    Perlo sprintf leidžia tokias universalias konversijas:

       %%	procento ženklas
       %c	simbolis su duotu numeriu
       %s	eilutė (string)
       %d	dešimtainis sveikasis skaičius su ženklu
       %u	dešimtainis sveikasis skaičius be ženklo
       %o	aštuntainis sveikasis skaičius be ženklo
       %x	šešioliktainis sveikasis skaičius be ženklo
       %e	slankiojančio kablelio skaičius, moksliškas užrašymas
       %f	slankiojančio kablelio skaičius, dešimtainis užrašymas
       %g	slankiojančio kablelio skaičius, %e arba %f notacija

    Priedo, Perl leidžia dar ir tokius plačiai palaikomus pertvarkymus:

       %X	kaip ir %x, bet naudojant didžiąsias raides
       %E	kaip %e, bet naudojant didžiąją "E"
       %G	kaip %g, bet najudojant didžiąją "E" (jei įmanoma)
       %b	dvejetainis skaičius be ženklo (unsigned)
       %p	rodyklė (pointeris) (išveda Perl reikšmės adresą šešioliktainėje sistemoje)
       %n	specialus: *saugo* išvestų simbolių skaičių į kitą kintamąjį parametrų saraše
            

    Galiausiai atgaliniam (iš tikrųjų "atgaliniam") tinkamumui Perl leidžia šiuos nebūtinus, bet plačiai palaikomus pertvarkymus:

       %i	sinonimas %d
       %D	sinonimas %ld
       %U	sinonimas %lu
       %O	sinonimas %lo
       %F	sinonimas %f

    Pažymėtina, jog eksponentinių skaitmenų skaičius moksliniu žymėjimas, pateiktas po %e , %E , %g ir %G skaičiams, kurių eksponentinis modulis mažesnis nei 100 priklauso nuo sistemos: gali būti trys ar mažiau skaičių(su nuliais prieky jei taip reikia). Kitais žodžiais tariant, 1.23 padaugintas iš dešimt laipsnyje 99 gali būti rodomas kaip "1.23e99" arba "1.23e099".

    Tarp% ir formato raidžių, galima įrašyti papildomų atributų, kontroliuojančių formato interpretaciją. Jie yra tokia:

    • tvarkymo parametrų indeksas

      Detalus formatavimo parametrų indeksas, toks kaip 2$. Pagal nutylėjimą, sprintf suformatuos einantį po jo saraše nepanaudautodą argumentą, bet įmanoma pasiimti argumentus nesilaikant tos tvarkos. Pvz.:

        printf '%2$d %1$d', 12, 34;      # išveda "34 12"
        printf '%3$d %d %1$d', 1, 2, 3;  # išveda "3 1 1"
    • vėliavėlės (flags)

      vienas ar daugiau iš: tarpas prieš teigiamą skaičių su tarpas + teigiamam skaičiui su pliuso ženklu - į kairę sulygiuotas tekstas, naudoti 0, ne tarpus kad sulygiuoti tekstą į dešinę pusę # prefiksas nenulinis aštuntainis skaičius su "0", nenulinis šešioliktainis su "0x", nenurinis dvejetainis su "0b"

      Pavyzdžiui:

        printf '<% d>', 12;   # išveda "< 12>"
        printf '<%+d>', 12;   # išveda "<+12>"
        printf '<%6s>', 12;   # išveda "<    12>"
        printf '<%-6s>', 12;  # išveda "<12    >"
        printf '<%06s>', 12;  # išveda "<000012>"
        printf '<%#x>', 12;   # išveda "<0xc>"
    • Vektoriaus vėliavėlė

      Vektoriaus vėliavėlė v , laisvai parenkamas, nusako naudoti join string'ą. Ši vėliavėlė nusako perlui interpretuoti paduotąją eilutę kaip sveikųjų skaičių vektorių, po vieną kiekvienam simboliui eilutėje, atskirtą duota seka (string)(taškas . pagal nutylėjimą). Tai gali būti naudinga norint parodyti simbolių kelintines reikšmes sutartose strings'uose:

        printf "version is v%vd\n", $^V;     # Perlo versija

      Padėkime žvaigždutę * prieš v perrašyti string'ą naudojamą atskirti numerius:

        printf "address is %*vX\n", ":", $addr;   # IPv6 addresas
        printf "bits are %0*v8b\n", " ", $bits;   # atsitiktinė bitų seka

      Taip pat galima detaliai aprašyti argumentų, panaudojamų eilutės jungimui, skaičių. Pvz *2$v:

        printf '%*4$vX %*4$vX %*4$vX', @addr[1..3], ":";   # 3 IPv6 addresai
    • (minimum) plotis

      Argumentai įprastai formatuojami tokio pločio, kokio reikalauja paduota reikšmė. Galima perrašyti plotį, įrašant numerį arba pasiimti pločio reikšmę iš kito argumento (su * ) arba iš aprašyto argumento (su pvz *2$):

        printf '<%s>', "a";       # išveda "<a>"
        printf '<%6s>', "a";      # išveda "<     a>"
        printf '<%*s>', 6, "a";   # išveda "<     a>"
        printf '<%*2$s>', "a", 6; # išveda "<     a>"
        printf '<%2s>', "long";   # išveda "<long>" (netrumpina ir neskaido)

      Jei lauko plotis, gautas iš * neigiamas, turi tokį patį efektą kaip ir - vėliavėlė - lygiavimas į kairę.

    • tikslumas arba maksimalus plotis

      Galima aprašyti tikslumą (skaitinėms konversijoms) arba maksimalus plotis (simbolinėms konversijoms) aprašant . ir po to skaičių. Slankiojančio kablelio formatai, išskyrus 'g' ir 'G', aprašo rodomų dešimtainių vietų skaičiųthis (pagal nutylėjimą - 6), pvz:

        # šie pavyzdžiai priklauso nuo sistemos specifikacijų
        printf '<%f>', 1;    # išveda "<1.000000>"
        printf '<%.1f>', 1;  # išveda "<1.0>"
        printf '<%.0f>', 1;  # išveda "<1>"
        printf '<%e>', 10;   # išveda "<1.000000e+01>"
        printf '<%.1e>', 10; # išveda "<1.0e+01>"

      'g' ir 'G', aprašo maksimalų rodomų skaitmenų kiekį, įskaitant iki kablelio ir po jo, pvz:

        # šie pavyzdžiai priklauso nuo sistemos specifikacijų
        printf '<%g>', 1;        # išveda "<1>"
        printf '<%.10g>', 1;     # išveda "<1>"
        printf '<%g>', 100;      # išveda "<100>"
        printf '<%.1g>', 100;    # išveda "<1e+02>"
        printf '<%.2g>', 100.01; # išveda "<1e+02>"
        printf '<%.5g>', 100.01; # išveda "<100.01>"
        printf '<%.4g>', 100.01; # išveda "<100>"

      Sveikųjų skaičių vertimams, aprašant tikslumą, reiškia, kad numerio išvedimas turėtų būti užpildytas nuliais iki reikalaujamo pločio:

        printf '<%.6x>', 1;      # išveda "<000001>"
        printf '<%#.6x>', 1;     # išveda "<0x000001>"
        printf '<%-10.6x>', 1;   # išveda "<000001    >"

      Simbolinių string'ų konversijoms, aprašant tikslumą, "apkarpo" eilutę, kad tilptų į reikalaujamą plotį:

        printf '<%.5s>', "truncated";   # išveda "<trunc>"
        printf '<%10.5s>', "truncated"; # išveda "<     trunc>"

      Taip pat tikslumą galima gauti iš kito argumento naudojant .*:

        printf '<%.6x>', 1;       # išveda "<000001>"
        printf '<%.*x>', 6, 1;    # išveda "<000001>"

      Šiuo metu negalima gauti tikslumo iš aprašyto skaičiaus, bet ketinama ateity tai įgyvendinti naudojant pvz .*2$:

        printf '<%.*2$x>', 1, 6;   # NETEISINGAI, bet ateity išves "<000001>"
    • dydis

      Skaitinėms konversijoms, galima nurodyti dydį, kuriuo remiantis interpretuoti skaičių kaip ir l , h , V , q, L , ar ll . Sveikųjų skaičių vertimams (d u o x X b i D U O ), skaičiai dažniausiai skaitomi esantys tokie, koks sveikojo skaičiaus dydis platformoje (dažniausiai 32 arba 64 bitai), bet galima tą perrašyti, kad naudotų vietoj platforminio dydžio - vieną standartinių C tipų, palaikomų kompiliatoriaus, naudoto Perlo "buildinimui":

         l           interpretuoti sveikuosius kaip C "long" arba "unsigned long" tipo
         h           interpretuoti sveikuosius kaip C "short" ar "unsigned short" tipo
         q, L or ll  interpretuoti sveikuosius kaip C "long long", "unsigned long long".
                     ar "quads" (dažniausiai 64-bit sveikieji)

      Paskutiniai nustatymai mes klaid1, jei Perl nesupranta "quad'ų" instaliacijoje. (Tam reikia, kad arba platforma palaikytų quad'us arba kad Perl būtų sukompiliuotas kad palaikytų juos.) Sužinoti ar quad'ai palaikomi galima per Config:

      	use Config;
      	($Config{use64bitint} eq 'define' || $Config{longsize} >= 8) &&
      		print "quads\n";

      Slankaus kablelio konversijoms (e f g E F G ), numeriai paprastai laikomi esantys slankaus kablelio dydžiu pagal nutylėjimą (double arba long double), bet galima "priversti" su q, L , arba ll , jei platforma juos palaiko. Sužinoti ar perl palaiko long double per Config:

      	use Config;
      	$Config{d_longdbl} eq 'define' && print "long doubles\n";

      Taip pat ar Perl laiko 'long double' esant slankaus kablelio dydį pagal nutylėjimą platformoje per Config:

              use Config;
              ($Config{uselongdouble} eq 'define') &&
                      print "long doubles by default\n";

      Taip pat gali būti atveju, kur long double ir double yra vienas ir tas pats:

              use Config;
              ($Config{doublesize} == $Config{longdblsize}) &&
                      print "doubles are long doubles\n";

      Dydžio specifikatorius V nieko nereiškia Perl kode, bet yra palaikomas dėl suderinamumo su XS kodu; tai reiškia "naudoti standartinį dydį Perl sveikiems skaičiams (ar slankaus kablelio skaičiams)", kas jau ir taip yra nustatyta pagal nutylėjimą Perl kode.

    • argumentų tvarka

      Šiaip jau sprintf pasiima sekantį nepanaudotą argumentą kaip formatavimo reikšmę kiekvienam formato aprašymui. Jei formato aprašyme yra * kad paprašytų papildomų argumentų, jie imami iš argumentų sarašo ta tvarka, kuria pasirodo formato aprašyme iki formatavimo reikšmės. Kai argumentas yra aprašytas detaliai, tai nepaveikia normalios tvarkos argumentams (net kai detalus indeksas buvo bet kokiu atveju sekantis argumentas).

      Taigi:

        printf '<%*.*s>', $a, $b, $c;

      naudotų $a pločiui, $b tikslumui ir $c kaip formatavimo reikšmę, o tuo tarpu:

        print '<%*1$.*s>', $a, $b;

      naudotų $a pločiui ir tikslumui, o $b kaip formatavimo reikšmę.

      Štai keletas dar pavyzdžių - atkreipkite dėmesį, kad kai naudojamas detalus indeksas $ gali reikėti praleisti:

        printf "%2\$d %d\n",    12, 34;		# išves "34 12\n"
        printf "%2\$d %d %d\n", 12, 34;		# išves "34 12 34\n"
        printf "%3\$d %d %d\n", 12, 34, 56;		# išves "56 12 34\n"
        printf "%2\$*3\$d %d\n", 12, 34, 3;		# išves " 34 12\n"

    Jei use locale galiojaa, simboliai, naudojami kableliui pertvarkytuose (formatuotuose) reailiuose skaičiuose yra pagal LC_NUMERIC lokalizaciją. Daugiau apie tai perllocale.

algirdas@perl.lt 2005.04.11 - $dabar