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 00:44 | Bezpečnostní upozornění

    Dne 21. října 2026 vydal projekt Node.js bezpečnostní aktualizace opravující deset zranitelností, včetně jedné umožňující potenciální vzdálené spuštění kódu (RCE). Nejzajímavější je CVE-2026-111497, chyba dekodéru Brotli, kterou objevili výzkumníci využívající OpenAI Codex Security. Chyba je v nativním dekodéru Brotli, nikoli v samotném JavaScriptu. Speciálně vytvořený komprimovaný vstup způsobí, že dekodér zamění

    … více »
    vencour | Komentářů: 0
    včera 17:44 | IT novinky

    Francouzský výrobce kabelů Nexans upozornil na napjaté dodávky elektrických kabelů. Výstavba nové výrobní linky pro některé typy kabelů může trvat přibližně tři roky. Datacentra potřebují rozsáhlé nízkonapěťové a středněnapěťové rozvody. Poptávka roste současně s modernizací elektrických sítí. Někteří odběratelé proto uzavírají výrazně delší dodavatelské smlouvy [Reuters].

    vencour | Komentářů: 5
    včera 14:44 | Zajímavý projekt

    Představena byla (𝕏) virtuální platforma FLYBENCH FPV, která nováčky provede zapojením a konstrukcí dronů.

    Ladislav Hagara | Komentářů: 3
    včera 04:11 | Nová verze

    Google Chrome 156 byl prohlášen za stabilní. Přehled novinek v poznámkách k vydání. Opraveno bylo 353 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    22.10. 20:22 | IT novinky

    Indická společnost eMudhra po bezpečnostním incidentu, tj. kompromitaci soukromých klíčů osmi mezilehlých certifikátů své certifikační autority, opouští globální byznys s SSL/TLS certifikáty.

    Ladislav Hagara | Komentářů: 4
    22.10. 15:44 | Bezpečnostní upozornění

    Dle Phoronixu zveřejnila společnost Trend Micro prostřednictvím programu Zero Day Initiative (ZDI) několik hlášení bezpečnostních zranitelností přímo na veřejném mailing listu LKML, přestože některé chyby dosud nemají opravu začleněnou do hlavní větve jádra. Mezi hlášenými problémy jsou dvě zranitelnosti s hodnocením CVSS 9.0, týkající se SMB Direct a KSMBD, které mohou umožnit vzdálené spuštění kódu. Další hlášení se týkají … více »

    vencour | Komentářů: 0
    22.10. 15:33 | Nová verze

    Správce hesel KeePassXC byl vydán ve verzi 2.8.0. Přechází na Qt 6, podporuje vkládání hesel s Waylandem, rychlé odemykání pomocí Polkitu nebo možnost nastavení klávesových zkratek (seznam změn).

    ʚĭɞ 🍉 | Komentářů: 0
    22.10. 15:22 | Nová verze

    Databáze DuckDB (Wikipedie) byla vydána ve verzi 2.0.0 LTS. S kódovým názvem Cinnamon Teal (čírka skořicová). S vyladěným protokolem Quack.

    Ladislav Hagara | Komentářů: 0
    22.10. 11:11 | Bezpečnostní upozornění

    V implementaci Broadcom 802.11 byla zjištěna chyba ve zpracování WPS/EAP, týká se to SDK od roku 2010. Broadcom podle výzkumníka Quentina Kaisera odmítl CVE přidělit. Modemy Huawei a Technicolor jsou používány i v ČR, v LTE routerech, běžných domácích routerech a firemních přístupových bodech, jejich současný počet a zranitelnost konkrétních verzí však zatím neznáme. Více detailů a demo. GitHub / Broadcom 802.11 SDK Detection Toolkit.

    vencour | Komentářů: 7
    22.10. 05:11 | Nová verze

    Byla vydána nová verze 10.8 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Přibyl balíček DietPi WireGuard.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (9%)
     (7%)
     (4%)
     (20%)
     (30%)
     (9%)
     (5%)
     (2%)
     (14%)
     (20%)
    Celkem 2901 hlasů
     Komentářů: 33, poslední 20.10. 23:44
    Rozcestník

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

    8.5.2016 14:00 | Přečteno: 2546× | 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ákno • Nahoru

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