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 06:00 | Zajímavý software

Byla vydána verze 0.56 open source platformy Home Assistant (GitHub) pro monitorování a řízení inteligentní domácnosti naprogramované v programovacím jazyce Python verze 3 a bežící také například na Raspberry Pi. Pro vyzkoušení je k dispozici demo [reddit].

Ladislav Hagara | Komentářů: 0
včera 16:55 | Nová verze

Byla vydána verze 1.0 klienta F-Droid určeného pro instalaci aplikací do Androidu ze softwarového repozitáře F-Droid (Wikipedie), alternativy k Google Play, nabízející pouze svobodný a otevřený software. Podrobnosti v přehledu změn [Hacker News].

Ladislav Hagara | Komentářů: 5
včera 00:55 | Nová verze

Po téměř 13 měsících vývoje od verze 0.11.0 byla vydána verze 0.12.0 hardwarově nenáročného desktopového prostředí LXQt (Lightweight Qt Desktop Environment, Wikipedie) vzniklého sloučením projektů Razor-qt a LXDE. Přehled novinek v příspěvku na blogu.

Ladislav Hagara | Komentářů: 9
21.10. 12:33 | Zajímavý software

Článek ne Medium představuje nejnovější stabilní verzi 2.0 svobodné decentralizované mikroblogovací platformy a sociální sítě podobné Twitteru Mastodon (Wikipedie). Detailní přehled novinek na GitHubu [Hacker News].

Ladislav Hagara | Komentářů: 0
21.10. 06:00 | Komunita

V Praze na půdě Elektrotechnické fakulty ČVUT dnes probíhá RT-Summit 2017 – setkání vývojářů linuxového jádra a uživatelů jeho real-time verze označované jako preempt-rt. Přednášky lze sledovat online na YouTube.

Ladislav Hagara | Komentářů: 0
20.10. 14:33 | Zajímavý projekt

Blender Animation Studio zveřejnilo první epizodu z připravovaného animovaného seriálu The Daily Dweebs o domácím mazlíčkovi jménem Dixey. Ke zhlédnutí také ve 3D s rozlišením 8K.

Ladislav Hagara | Komentářů: 0
20.10. 12:34 | Komunita

Aktualizovanou počítačovou hru Warhammer 40,000: Dawn of War III v ceně 39,99 eur běžící také na Linuxu lze o víkendu na Steamu hrát zdarma a případně ještě v pondělí koupit s 50% slevou. Do soboty 19:00 lze na Humble Bundle získat zdarma Steam klíč k počítačové hře Sid Meier's Civilization® III v ceně 4,99 eur běžící také ve Wine.

Ladislav Hagara | Komentářů: 0
20.10. 00:22 | Nasazení Linuxu

Společnost Samsung oznámila, že skrze dokovací stanici DeX a aplikaci Linux on Galaxy bude možno na Samsung Galaxy S8 a S8+ a Galaxy Note 8 provozovat Linux. Distribuce nebyly blíže upřesněny.

Phantom Alien | Komentářů: 19
19.10. 23:55 | Komunita

Společnost Purism na svém blogu oznámila, že její notebooky Librem jsou nově dodávány se zrušeným (neutralized and disabled) Intel Management Engine (ME). Aktualizací corebootu na již prodaných noteboocích lze Management Engine také zrušit. Více v podrobném článku.

Ladislav Hagara | Komentářů: 2
19.10. 21:44 | Nová verze

Organizace Apache Software Foundation (ASF) na svém blogu slaví páté výročí kancelářského balíku Apache OpenOffice jako jejího Top-Level projektu. Při této příležitosti byl vydán Apache OpenOffice 4.1.4 (AOO 4.1.4). Podrobnosti v poznámkách k vydání. Dlouhé čekání na novou verzi tak skončilo.

Ladislav Hagara | Komentářů: 8
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (9%)
 (0%)
 (0%)
 (1%)
 (76%)
 (13%)
Celkem 221 hlasů
 Komentářů: 8, poslední včera 23:02
    Rozcestník

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

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