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í
×
    dnes 04:00 | IT novinky

    Anthony Enzor-DeMeo je novým CEO Mozilla Corporation. Mozillu převzal po dočasné CEO Lauře Chambers. Vybudovat chce nejdůvěryhodnější softwarovou společnost na světě. Firefox by se měl vyvinout v moderní AI prohlížeč.

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

    Byla vydána nová verze 9.20 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Vypíchnout lze například nový balíček RustDesk Server pro vzdálený přístup.

    Ladislav Hagara | Komentářů: 0
    včera 14:44 | Nová verze

    Jonathan Thomas oznámil vydání nové verze 3.4.0 video editoru OpenShot (Wikipedie). Představení novinek také na YouTube. Zdrojové kódy OpenShotu jsou k dispozici na GitHubu. Ke stažení je i balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo na spouštění a spustit.

    Ladislav Hagara | Komentářů: 0
    včera 14:22 | Nová verze

    Byla vydána nová verze 1.6 otevřeného, licenčními poplatky nezatíženého, univerzálního ztrátového formátu komprese zvuku Opus (Wikipedie) a jeho referenční implementace libopus. Podrobnosti na demo stránce.

    Ladislav Hagara | Komentářů: 2
    včera 01:33 | Komunita

    Vojtěch Polášek představil Vojtux, tj. linuxovou distribuci pro zrakově postižené uživatele. Vychází ze spinu Fedory 43 s desktopovým prostředím MATE. Konečným cílem je, aby žádný Vojtux nebyl potřeba a požadovaná vylepšení se dostala do upstreamu.

    Ladislav Hagara | Komentářů: 10
    včera 00:33 | Nová verze

    Byla vydána (Mastodon, 𝕏) druhá RC verze GIMPu 3.2. Přehled novinek v oznámení o vydání. Podrobně v souboru NEWS na GitLabu.

    Ladislav Hagara | Komentářů: 0
    15.12. 15:22 | Zajímavý článek

    Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 160 (pdf).

    Ladislav Hagara | Komentářů: 0
    15.12. 14:11 | IT novinky

    Izrael od února zakáže dětem používat v prostorách základních škol mobilní telefony. Podle agentury AFP to uvedlo izraelské ministerstvo školství, které zdůraznilo negativní dopady, které na žactvo používání telefonů má. Izrael se tímto krokem přidává k rostoucímu počtu zemí, které dětem ve vzdělávacích zařízeních přístup k telefonům omezují.

    Ladislav Hagara | Komentářů: 33
    15.12. 14:00 | IT novinky

    Internetová společnost Google ze skupiny Alphabet pravděpodobně dostane příští rok pokutu od Evropské komise za nedostatečné dodržování pravidel proti upřednostňování vlastních služeb a produktů ve výsledcích vyhledávání. V březnu EK obvinila Google, že ve výsledcích vyhledávání upřednostňuje na úkor konkurence vlastní služby, například Google Shopping, Google Hotels a Google Flights. Případ staví Google proti specializovaným

    … více »
    Ladislav Hagara | Komentářů: 8
    15.12. 12:22 | Pozvánky

    Byl oznámen program a spuštěna registrace na konferenci Prague PostgreSQL Developer Day 2026. Konference se koná 27. a 28. ledna a bude mít tři tracky s 18 přednáškami a jeden den workshopů.

    TomasVondra | Komentářů: 0
    Jaké řešení používáte k vývoji / práci?
     (34%)
     (48%)
     (20%)
     (17%)
     (23%)
     (15%)
     (24%)
     (15%)
     (18%)
    Celkem 471 hlasů
     Komentářů: 19, poslední 11.12. 20:04
    Rozcestník

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

    8.5.2016 14:00 | Přečteno: 2019× | 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.