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 23:00 | Nová verze

Po osmi letech od prvního commitu byla vydána verze 1.0 webového frameworku Flask (Wikipedie) napsaného v Pythonu. Přehled novinek v oznámení o vydání. Instalovat lze z PyPI. Odstraněna byla podpora Pythonu 2.6 a 3.3.

Ladislav Hagara | Komentářů: 0
dnes 16:22 | Zajímavý článek

Nadace Raspberry Pi vydala devětašedesáté číslo (pdf) anglicky psaného časopisu MagPi věnovanému Raspberry Pi a projektům postaveným na tomto jednodeskovém počítači a šesté číslo (pdf) časopisu pro kutily HackSpace věnovanému navíc 3D tisku, pájení, řezání nebo i elektronice a IoT.

Ladislav Hagara | Komentářů: 0
dnes 14:11 | Komunita

Byl zveřejněn seznam 44 osob přijatých do programu Outreachy od 14. května do 14. srpna 2018. Cílem programu Outreachy je přitáhnout do světa svobodného a otevřeného softwaru lidi ze skupin, jež jsou ve světě svobodného a otevřeného softwaru málo zastoupeny.

Ladislav Hagara | Komentářů: 11
dnes 11:44 | Nová verze

Glen MacArthur vydal verzi 2018.4.2 na Debianu založené linuxové distribuce optimalizované pro tvůrce audio a video obsahu AV Linux (Wikipedie). Podrobnosti v oznámení o vydání a v stotřicetistránkovém manuálu (pdf).

Ladislav Hagara | Komentářů: 0
včera 23:33 | Nová verze

Byla vydána nová stabilní verze 1.15 (1.15.1147.36) webového prohlížeče Vivaldi (Wikipedie). Z novinek lze zdůraznit možnost nastavení vlastního pozadí okna, přístup k záložkám z hlavního menu, lepší ovládatelnost v režimu celé obrazovky nebo vyřešení problémů se zvukem v HTML5. Nejnovější Vivaldi je postaveno na Chromiu 65.0.3325.183.

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

Node.js Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 10.0.0 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). Verze 10 se v říjnu stane novou aktivní LTS verzí. Podpora je plánována do dubna 2021.

Ladislav Hagara | Komentářů: 0
včera 15:33 | Nová verze

Neal Cardwell ze společnosti Google oznámil zveřejnění verze 2.0 nástroje pro testování síťového stacku packetdrill. Jde o souhrnné vydání změn z interního vývoje od roku 2013.

Michal Kubeček | Komentářů: 0
včera 13:22 | Zajímavý software

Microsoft na svém blogu oznámil, že správce knihoven pro C++ Vcpkg (VC++ Packaging Tool) lze nově používat také na Linuxu a macOS. Aktuálně je pro Linux k dispozici více než 350 knihoven [reddit].

Ladislav Hagara | Komentářů: 1
včera 12:44 | Komunita

Byly zveřejněny exploity na Nintendo Switch a platformu Tegra X1: Fusée Gelée a ShofEL2. Jejich zneužití nelze zabránit softwarovou aktualizací. Na druhou stranu exploity umožní na Nintendo Switch snadno a rychle nainstalovat Linux, viz. ukázka na YouTube. Jenom je potřeba sáhnout na hardware.

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

Byla vydána verze 2.12.0 QEMU (Wikipedie). Přispělo 204 vývojářů. Provedeno bylo více než 2 700 commitů. Přehled úprav a nových vlastností v seznamu změn. Řešeny jsou také bezpečnostní chyby Meltdown a Spectre.

Ladislav Hagara | Komentářů: 7
Používáte na serverech port knocking?
 (3%)
 (7%)
 (47%)
 (26%)
 (18%)
Celkem 388 hlasů
 Komentářů: 29, poslední 5.4. 12:25
    Rozcestník

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

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