abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 22:33 | Nová verze

    Byla vydána beta verze openSUSE Leap 16. Ve výchozím nastavení s novým instalátorem Agama.

    Ladislav Hagara | Komentářů: 0
    včera 17:44 | Zajímavý článek

    Devadesátková hra Brány Skeldalu prošla portací a je dostupná na platformě Steam. Vyšel i parádní blog autora o portaci na moderní systémy a platformy včetně Linuxu.

    karkar | Komentářů: 0
    včera 12:11 | Humor

    Lidi dělají divné věci. Například spouští Linux v Excelu. Využít je emulátor RISC-V mini-rv32ima sestavený jako knihovna DLL, která je volaná z makra VBA (Visual Basic for Applications).

    Ladislav Hagara | Komentářů: 2
    včera 10:44 | IT novinky

    Revolut nabídne neomezený mobilní tarif za 12,50 eur (312 Kč). Aktuálně startuje ve Velké Británii a Německu.

    Ladislav Hagara | Komentářů: 22
    včera 09:55 | IT novinky

    Společnost Amazon miliardáře Jeffa Bezose vypustila na oběžnou dráhu první várku družic svého projektu Kuiper, který má z vesmíru poskytovat vysokorychlostní internetové připojení po celém světě a snažit se konkurovat nyní dominantnímu Starlinku nejbohatšího muže planety Elona Muska.

    Ladislav Hagara | Komentářů: 2
    včera 09:33 | IT novinky

    Poslední aktualizací začal model GPT-4o uživatelům příliš podlézat. OpenAI jej tak vrátila k předchozí verzi.

    Ladislav Hagara | Komentářů: 0
    včera 08:11 | Nová verze

    Google Chrome 136 byl prohlášen za stabilní. Nejnovější stabilní verze 136.0.7103.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 8 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    29.4. 20:55 | Nová verze

    Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.

    Ladislav Hagara | Komentářů: 0
    29.4. 16:22 | Nová verze

    Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    29.4. 15:55 | Pozvánky

    Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových

    … více »
    Zdenek H. | Komentářů: 2
    Jaký filesystém primárně používáte?
     (58%)
     (1%)
     (9%)
     (22%)
     (4%)
     (1%)
     (2%)
     (0%)
     (1%)
     (3%)
    Celkem 493 hlasů
     Komentářů: 19, poslední včera 11:32
    Rozcestník

    Naučte mě Perl 6, V. One-liners

    8.5.2016 14:00 | Přečteno: 1902× | Perl | Výběrový blog | poslední úprava: 8.5.2016 14:00

    V tomto díle blogu o Perlu 6 se podíváme na tzv. one-liners, tedy programy psané přímo do příkazového řádku shellu.

    V. One-liners

    Perl umožňuje psát program přímo do příkazové řádky. Díky tomu můžete namísto linuxových nástrojů jako sed, awk, grep,… používat tzv. Perl one-liners. U mě to došlo tak daleko, že místo toho abych zjišťoval jak escapuje echo, použiji raději něco jako perl6 -e 'say join "\n", "a\tb", "1\t2"'. Ale samozřejmě nic vám nebrání, když uznáte za vhodné, tyto one-liners kombinovat s nástroji jako find, column,….

    Přepínače spuštění

    Základním přepínačem pro one-liners je -e, za kterým následuje kód Perlu 6, který se spustí.
      perl6 -e 'say  ((237/75+162/3)/(9+54)).nude.join: "/" ;'  #1429/1575
      perl6 -e 'say  "larry wall".wordcase;'                    #Larry Wall
    
    Dalšími užitečné přepínače jsou -n a -p, které automaticky přidají smyčku přes všechny řádky, -p je na konci ještě vytiskne.
      history|perl6 -ne '.say if m:r:s/^^perl6 "-"ne>>/ && /:r <<if>> /'           #vytiskni řádky které začínají na perl6 -ne a obsahují slovo if
      perl6 -ne '.say if /"<"pre>>/ ff /"<""/"pre">"/' naucte_me_Perl_6_III.html   #vytiskni řádky ohraničené značkou pre
      xsel|perl6 -pe '.=trim'                                                      #odstraní mezery před a za řádkem
      perl6 -pe 's:g/wamba/wambash/' /etc/passwd                                   #nahradí wamba za wambash
    
    Další one-liners v Perlu 6 najdete i na githubu Davida Farrella.

    Parametry spuštění

    Některé příkazy např. line, slurp,…, implicitně čtou se standardního vstupu a pokud je zadán parametr, tak se souborů, které májí názvy jako parametry. Ale k parametrům na příkazové řádce můžeme přistupovat i pomocí @*ARGS, nebo pomocí definice podprogramu MAIN. Se standardním vstupem/výstupem můžeme manipulovat pomocí proměnných $*IN, $*OUT.
      cat soubor1|perl6 -e 'say lines.elems'                              #počet řádků v soubor1
      perl6 -e 'say lines.elems' soubor1                                  #totéž
      cat soubor1|perl6 -e 'say lines.elems' soubor2 soubor3              #počet řádků v soubor2 + v soubor3
      cat soubor1|perl6 -e 'say $*IN.lines.elems' soubor2 soubor3         #počet řádků v soubor1
      cat soubor1|perl6 -e 'say @*ARGS[1].IO.lines.elems' soubor2 soubor3 #počet řádků v soubor3
      cat soubor1|perl6 -e 'sub MAIN ($,$soubor) { say $soubor.IO.lines.elems }' soubor2 soubor3 #totéž
    

    Některé drobnosti užitečné nejen pro one-liners

    Pamatujete na první blog, kdy jsme ukazovali 4 možnosti jak zapsat @a.join: "\n", tak další možností je užít tzv. feed operátor ==>, popř. <==, který se nejčastěji používá k práci s poli.
      perl6 -e 'say() <== join "\n" <== ^10'
      perl6 -e '^10 ==> join "\n" ==> say()'
      perl6 -e '^10 ==> { @^a Z+ @^a[1.. *] }() ==> sum() ==> say()' #81
    
    Kromě ntic jsou v Perlu 6 i páry a => 12, :a<12>, :12a, které se skládají s klíče a hodnoty. Jedna věc, kterou jsem si hned oblíbil, je push párů do asociativního pole.
      perl6 -e 'say (%).push: (a => 3, b => 10, :a<12>, :21a);'   #{a => [3 12 21], b => 10}
      perl6 -e 'say (%).push: <a b b c a c> Z=> 1 .. *'           #{a => [1 5], b => [2 3], c => [4 6]}
    
    Povšimněte si jak jsme použili anonymní proměnnou asociativního pole %, kterou nemusíme definovat. Podobně by jsme mohli použít pro push do pole @, nebo pro práci s čísly, resp. řetězci $.
      perl6 -e 'say (@).push: "a", "b", "c"' #[a b c]
      xsel|perl6 -pe '$_ [R~]= $++ ~ ","'    #očísluje jednotlivé řádky
    

    Ukázkový příklad

    To jak Perl 6 umožňuje psát one-liners různými způsoby, demonstrujeme na příkladu inspirovaný tímto dotazem. Napíšeme několik one-linerů, které budou sčítat čísla v pátém sloupci podle tabulátoru, před řádkem --.

    První si vygenerujeme testovací data:
      perl6  -e 'use Inline::Perl5; use Data::Random:from<Perl5> <:all>; ( loop { join "\t", rand_words(:2min :3max)>>.tc.join(" "), rand_datetime(), (^100).roll(4), rand_words() } ).head(1000).rotor((^20+1).roll(10)).&cross("--")>>.say ' >>Plocha/DATA.txt
    
    V diskuzi pod prvním blogem o Perlu 6 jsem si stěžoval, že načítání Inline::Perl5 je neúměrně dlouhé. Tady byla sjednána náprava a již to trvá méně než vteřinu. Nicméně vygenerovaní cca 1000 položek předešlým one-linerem trvá více než 30 vteřin. Testovací data vypadají přibližně takto:
    Festive Journeyman      2016-11-05 22:04:01     34      68      17      84      piss
    Frightens Astray        2016-09-14 22:41:45     5       2       93      84      reprograms
    Cards Optima Fisher     2016-09-18 12:45:06     85      29      72      40      transitivity
    --
    Presumably Gore 2016-05-30 09:29:56     7       49      68      69      archipelagoes
    Soccer Devotions        2016-10-03 22:13:15     64      79      23      88      delaying
    --
    Footfall Bliss  2016-07-02 17:20:29     29      22      33      2       connect
    Merely Transcends Moline        2016-08-15 13:36:36     87      94      9       14      pounce
    Advocated Compliments Sputter   2016-05-11 00:04:53     15      38      22      69      inconsiderate
    --
    Promotes Tread Complexes        2016-08-18 17:38:55     1       47      91      41      devised
    --
    
    První řešení napodobí to v Perlu 5 ze zmíněné diskuze. Použijeme přepínač -n, zapamatujeme si předešlý řádek, a pokud současný řádek je roven --, tak přičteme jeho pátý sloupec do $sum. Nakonec $sum vypíšeme.
      perl6  -ne 'state $pred; state $sum += $pred.split("\t").[4] if $_ eq "--"; $pred=$_; END {say $sum}' Plocha/DATA.txt
    
    V druhém řešení místo každého řádku budeme brát dvojici řádek, následující_řádek. Vyfiltrujeme ty dvojici které mají první prvek roven -- a následně s nultého prvku vybereme 5. sloupec, sečteme a vytiskneme.
      perl6 -e 'lines().rotor( 2 => -1 ) ==> grep *.[1] eq "--" ==> map *.[0].split("\t").[4] ==> sum() ==> say() ' Plocha/DATA.txt
    
    Další řešení pracuje s páry ve tvaru následující_řádek => řádek a použijeme push do asociativního pole. Vybereme prvek (pole) odpovídající klíči --, vybereme 5. sloupce, sečteme a vytiskneme.
      perl6 -e '(%).push( lines().&{ @^a[1 .. *] Z=> @^a } ).<-->.map( *.split("\t").[4] ).sum.say' Plocha/DATA.txt
    
    Také se můžeme najít regulární výraz, který přímo vybere pátý sloupec před řádkem --.
      perl6 -e 'slurp.comb(/:r^^[\T+\t] ** 4 <( \d+ )> \N*\n "--" \n/).sum.say' Plocha/DATA.txt
    
    Poslední řešení rozdělí data pomocí --\n. Poté z jednotlivých částí vezme pátý sloupec posledního řádku, sečte, vytiskne.
      perl6 -e 'slurp.split("--\n", :skip-empty).map( *.lines.[*-1].split("\t").[4] ).sum.say' Plocha/DATA.txt
    
    

    Další příklady

    Dotaz: Program, který vytvoří kombinaci všech řádků souboru.
      perl6 -e 'unit sub MAIN;   spurt $^file ~ ++$, .join: "\n" for $^file.IO.lines.permutations' pok.txt
    
    Nalezení duplikátních řádků.
      perl6 -e '(%).push( slurp.lines.pairs.invert ).grep( *.value.elems > 1).sort( *.value.elems )>>.say' soubor.txt
    
    Nahrazení části textového souboru jiným.
      perl6 -e 'unit sub MAIN; my @soubor1 = $^soubor1.IO.lines; say join "\n", @soubor1, $^soubor2.IO.lines.[@soubor1.elems .. *]' pok.txt soubor.txt
    
    Bash - násobení po řádcích
      perl6 -ne '$_ ==> split "x" ==> map (* * 1.328).round ==> join "x" ==> say()' soubor.txt
      perl6 -ne '.split("x").map( * * 1.328 )>>.round.join("x").say' soubor.txt
    

    Závěr

    Ukázali jsme, že Perl 6 má mnoho prostředků jak nám usnadnit psaní one-linerů a jednoduše nám umožňuje psát krátké programy přímo do programové řádky. Jak vy píšete one-linery? Spoléháte se na základní linuxové nástroje, nebo se nezdráháte je opepřit např. nějakým skriptovacím jazykem?        

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    8.5.2016 23:19 RM
    Rozbalit Rozbalit vše Re: Naučte mě Perl 6, V. One-liners
    Párkrát jsem v Perlu u takovýchto výrazů zápasil s buffered výstupem. Perl6 to má stejné, nebo se to řeší jinak?
    wamba avatar 9.5.2016 08:56 wamba | skóre: 38 | blog: wamba
    Rozbalit Rozbalit vše Re: Naučte mě Perl 6, V. One-liners
    Aktuálně Perl 6 tiskne hned, tedy
    perl6 -e 'print "a"; sleep(5); say "b";'
    
    vytiskne a a za pět vteřin b.

    Oproti Perl 5 verzi
    perl -E 'print "a"; sleep(5); say "b";'
    
    která vytiskne až po pěti vteřinách ab.

    Nicméně v Sinopsis je napsáno, že by autoflush, měl fungovat, až po zapnutí $*OUT.autoflush, popř. by měli jít všechny data najednou uvolnit pomocí flush.
    This would have been so hard to fix when you don't know that there is in fact an easy fix.
    9.5.2016 11:20 RM
    Rozbalit Rozbalit vše Re: Naučte mě Perl 6, V. One-liners
    To vypadá rozumně, pokud je to tak, že s -e je aktivován rovnou autoflush.
    wamba avatar 9.5.2016 13:40 wamba | skóre: 38 | blog: wamba
    Rozbalit Rozbalit vše Re: Naučte mě Perl 6, V. One-liners
    Tak jsem se asi trochu unáhlil ten autoflush je v odstraněných funkcích a je tam napsáno, že je to ponecháno na implementaci. Vypadá to, že Rakudo flushuje automaticky. Kdyby náhodou někde ne, tak ta metoda flush by měla funguvat.
    This would have been so hard to fix when you don't know that there is in fact an easy fix.
    12.5.2016 12:32 lm
    Rozbalit Rozbalit vše Re: Naučte mě Perl 6, V. One-liners
    takto si skusal?
    perl -E '$|++; print "a"; sleep(5); say "b";'
    14.5.2016 17:47 RM
    Rozbalit Rozbalit vše Re: Naučte mě Perl 6, V. One-liners
    znám, ale bylo třeba na to myslet

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.