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 11:11 | Zajímavý článek

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

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

    Po delší době vývoje vyšla nativní linuxová verze virtuálního bubeníka MT-PowerDrumKit 2 ve formátu VST3. Mezi testovanými hosty jsou Reaper, Ardour, Bitwig a Carla.

    balda | Komentářů: 1
    včera 21:33 | Nová verze

    Desktopové prostředí Budgie bylo vydáno ve verzi 10.10. Dokončena byla migrace z X11 na Wayland. Budgie 10 vstupuje do režimu údržby. Vývoj se přesouvá k Budgie 11. Dlouho se řešilo, v čem bude nové Budgie napsáno. Budgie 10 je postaveno nad GTK 3. Přemýšlelo se také nad přepsáním z GTK do EFL. Budgie 11 bude nakonec postaveno nad Qt 6.

    Ladislav Hagara | Komentářů: 0
    včera 13:00 | Humor

    OpenChaos.dev je 'samovolně se vyvíjející open source projekt' s nedefinovaným cílem. Každý týden mohou lidé hlasovat o návrzích (pull requestech), přičemž vítězný návrh se integruje do kódu projektu (repozitář na GitHubu). Hlasováním je možné změnit téměř vše, včetně tohoto pravidla. Hlasování končí vždy v neděli v 9:00 UTC.

    NUKE GAZA! 🎆 | Komentářů: 3
    včera 03:00 | Nová verze

    Byl vydán Debian 13.3, tj. třetí opravná verze Debianu 13 s kódovým názvem Trixie a Debian 12.13, tj. třináctá opravná verze Debianu 12 s kódovým názvem Bookworm. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 13 a Debianu 12 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.

    Ladislav Hagara | Komentářů: 0
    10.1. 03:00 | Komunita

    Na stránkách Evropské komise, na portálu Podělte se o svůj názor, se lze do 3. února podělit o názor k iniciativě Evropské otevřené digitální ekosystémy řešící přístup EU k otevřenému softwaru.

    Ladislav Hagara | Komentářů: 6
    9.1. 19:44 | Zajímavý software

    Společnost Kagi stojící za stejnojmenným placeným vyhledávačem vydala (𝕏) alfa verzi linuxové verze (flatpak) svého proprietárního webového prohlížeče Orion.

    Ladislav Hagara | Komentářů: 5
    9.1. 19:11 | IT novinky

    Firma Bose se po tlaku uživatelů rozhodla, že otevře API svých chytrých reproduktorů SoundTouch, což umožní pokračovat v jejich používání i po plánovaném ukončení podpory v letošním roce. Pro ovládání také bude stále možné využívat oficiální aplikaci, ale už pouze lokálně bez cloudových služeb. Dokumentace API dostupná zde (soubor PDF).

    NUKE GAZA! 🎆 | Komentářů: 2
    9.1. 14:22 | Zajímavý článek

    Jiří Eischmann se v příspěvku na svém blogu rozepsal o open source AdGuard Home jako domácí ochraně nejen před reklamou. Adguard Home není plnohodnotným DNS resolverem, funguje jako DNS forwarder s možností filtrování. To znamená, že když přijme DNS dotaz, sám na něj neodpoví, ale přepošle ho na vybraný DNS server a odpovědi zpracovává a filtruje dle nastavených pravidel a následně posílá zpět klientům. Dá se tedy používat k blokování reklamy a škodlivých stránek a k rodičovské kontrole na úrovni DNS.

    Ladislav Hagara | Komentářů: 7
    9.1. 03:33 | Zajímavý software

    AI Claude Code od Anthropicu lépe rozumí frameworku Nette, tj. open source frameworku pro tvorbu webových aplikací v PHP. David Grudl napsal plugin Nette pro Claude Code.

    Ladislav Hagara | Komentářů: 1
    Které desktopové prostředí na Linuxu používáte?
     (8%)
     (4%)
     (0%)
     (9%)
     (20%)
     (3%)
     (5%)
     (3%)
     (11%)
     (49%)
    Celkem 381 hlasů
     Komentářů: 8, poslední 10.1. 23:18
    Rozcestník

    Perlová magie 2 aneb zákeřnost

    2.2.2007 14:42 | Přečteno: 1453× | Perl | poslední úprava: 5.2.2007 12:52

    Při ladění jednoho kusu kódu jsem narazil na další perlovou nechutnost. Vyzkoušejte sami:

    perl -le 'sub a {@{$_[0]}}; sub b {a($_[0]), a($_[1])}; print scalar b([1,2], [3,4,5])'
    Jaký by jste čekali výsledek? Já jsem čekal 5 a ono 3. Skoro bych to považoval za bug. Proč 5? Protože
    perl -le 'sub a {@{$_[0]}}; sub b {a($_[0]), a($_[1])}; print scalar(@c=b([1,2], [3,4,5]))'

    Abych předešel dalšímu šíření chyby tak se to dá řešit třeba takto:

    perl -le 'sub a {@{$_[0]}}; sub b {@{[a($_[0]), a($_[1])]}}; print scalar b([1,2], [3,4,5])'
    Problém je v tom, že když chcete udělat funkci, která vrací spojení dvou a více polí vrácených dvěma a více jinými funkcemi, tak sice dostanete správné pole, ale funkce scalar vyhodnotí pouze výsledek poslední funkce. Je nutné to pole materializovat a potom se to chová správně. Ale kdo na to má myslet?

    Update: Kdykoli funkce má vracet pole, ujistěte se, že skutečně vrací pole a to i ve skalárním kontextu. Tedy, že výsledkem je array proměnná, grep, map, split a další array funkce, nikdy hodnoty oddělené čárkou. V opačném případě ve skalárním kontextu nebude výstupem počet prvků pole, ale poslední prvek ve skalárním kontextu. (viz Comma Operator v perlop) Samozřejmě vyjma případu, kdy to opravdu zamýšlíte, nebo měníte chování podle wantarray

    Update2:Minimalistická demonstrace problému:

    perl -le 'print scalar sub{(3,2,1)}->()'
    vs.
    perl -le 'print scalar sub{@{[3,2,1]}}->()'

           

    Hodnocení: 83 %

            špatnédobré        

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

    Komentáře

    Vložit další komentář

    2.2.2007 14:49 zde | skóre: 9 | blog: Linuch | Brno
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Který sadista vás donutil používat perl?
    Táto, ty de byl? V práci, já debil.
    2.2.2007 14:53 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Blokovat používám jen opravdu vyjímečně, pokračuj v načatém kurzu a jseš druhej člověk, na který ho použiju.
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    2.2.2007 15:11 zde | skóre: 9 | blog: Linuch | Brno
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Proč se hned urážíte? Mě v tom nutí dělat taky, jsme na stejné lodi. Akorát jsem moc nepochopil v čem je problém. To že si Perl vysvětluje programátorovy intence velmi volně a používá skalární a seznamový kontext naprosto neočekávaně je věc známá, proto peru syntaktický noise jako @{} kamkoliv se dá.

    Posledně mě vypeklo něco jako

    $a = undef;
    $a += undef;
    print defined($a);
    
    Táto, ty de byl? V práci, já debil.
    2.2.2007 15:26 happy barney | skóre: 34 | blog: dont_worry_be_happy
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    imho sa mýlite, k perl-u nútiť netreba :-)
    2.2.2007 15:28 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Mě v tom nutí dělat taky, jsme na stejné lodi.
    Myslím že ne Time ;-). Afaik je Perl jeho oblíbeným jazykem.
    When your hammer is C++, everything begins to look like a thumb.
    2.2.2007 15:31 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Sorry, asi jsem to špatně pochopil, mě do toho nikdo nutit nemusí, já v tom programuju profesionálně, dobrovolně a velké projekty. Syntaktický cukry bych radši necpal, kde se dá, protože to degraduje rychlost. To radši budu vědět co to dělá a proč. Ten váš poslední příklad je celkem normální. Zapněte si warning a uvidíte proč. Prostě undef+undef je 0+0 a undef.undef je ''.''. Stejně jako 'text'+0 je 0 a 'text'.0 je 'text0'.
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    2.2.2007 16:15 zde | skóre: 9 | blog: Linuch | Brno
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Jasně, já jen čekal že Perl při počítání s undef-em buď hodí výjimku (ala Python), nebo aspoň garantuje že výsledek bude zase undef (ala SQL). Ale on to vesele zkonvertuje na nulu a směje se... Mimochodem aritmetika je v perlu fakt podivná, jsou tam věci jako 1 << 32 == 1, -1 | 1 == 4294967295 a podobné vypečenosti..
    Táto, ty de byl? V práci, já debil.
    2.2.2007 16:22 MJ | Tady a teď
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Jenže takhle podivnou aritmetiku má i Céčko :-)

    Operátor << není definován pro posun větší nebo rovný šířce slova (na i386 posouvá modulo šířka slova), operátor | je z definice unsigned.
    2.2.2007 16:30 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Jenže takhle podivnou aritmetiku má i Céčko :-)
    To ano, ale u skriptovacích jazyků nebývá argument "takto se chová i céčko" moc dobrý ;-). Tvůrce Pythonu například bezmyšlenkovitě okopíroval sémantiku dělení, kdy int / int --> int, kdežto Perl na 5/2 vrací 2.5.
    When your hammer is C++, everything begins to look like a thumb.
    2.2.2007 16:36 zde | skóre: 9 | blog: Linuch | Brno
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Ne tak docela..

    http://www.python.org/doc/2.2.3/whatsnew/node7.html
    Táto, ty de byl? V práci, já debil.
    2.2.2007 16:50 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Aha, o from __future__ import division jsem nevěděl.
    When your hammer is C++, everything begins to look like a thumb.
    3.2.2007 11:46 MJ | Tady a teď
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    To ano, ale u skriptovacích jazyků nebývá argument "takto se chová i céčko" moc dobrý ;-).
    Ne, ale říká, že jsou dobré důvody k tomu, aby takovéhle výrazy neměly definovanou hodnotu.
    Tvůrce Pythonu například bezmyšlenkovitě okopíroval sémantiku dělení, kdy int / int --> int, kdežto Perl na 5/2 vrací 2.5.
    Perl vrací buďto 2 nebo 2.5 podle toho, jestli jste si zapnul integerový nebo floatový mód (use integer).
    2.2.2007 16:52 zde | skóre: 9 | blog: Linuch | Brno
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Perl je multiplatformní, vlastnosti x86 architektury jsou irelevantní. Perl se navíc občas TVÁŘÍ jako že umí počítat s čísly nad 2**32, viz:
    $ perl -le 'print 2**32'
    4294967296
    $ perl -le 'print (2**32) + 1'
    4294967297
    $ perl -le 'print 2**31'
    2147483648
    $ perl -le 'print (2**31)*2'
    2147483648 (ehhh?)
    $ perl -le 'print 1 << 31'
    2147483648
    $ perl -le 'print (1 << 31) << 1'
    2147483648 (ehhh?)
    
    Táto, ty de byl? V práci, já debil.
    2.2.2007 17:10 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Ehh, musím uznat, že to není moc dobré
    $ perl -le 'print 2*(2**31)'
    4294967296
    $ perl -le 'print ((2**31)*2)'
    4294967296
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    2.2.2007 18:29 happy barney | skóre: 34 | blog: dont_worry_be_happy
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
     perl -w -le 'print (2**31)*2'
    print (...) interpreted as function at -e line 1.
    Useless use of multiplication (*) in void context at -e line 1.
    2147483648
    
     perl -w -le 'print (1 << 31) << 1'
    print (...) interpreted as function at -e line 1.
    Useless use of left bitshift (<<) in void context at -e line 1.
    2147483648
    
    perl imho predpokladá, že ho používa rozmýšľajúce stvorenie :-D
    5.2.2007 09:24 zde | skóre: 9 | blog: Linuch | Brno
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Rozmýšlející stvoření předpokládá, že když je někdo tak pitomej že v návrhu jazyka udělá () pro volání funkcí nepovinné, dá těm implicitním závorkám aspoň rozumnou prioritu vzhledem k ostatním operátorům.. Nebo ať aspoň print není funkce, ale statement, jak bývá (nepříliš dobrým, uznávám) zvykem.
    Táto, ty de byl? V práci, já debil.
    5.2.2007 12:48 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Perl je velmi přátelský jazyk, ale své přátele si vybírá.
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    2.2.2007 16:23 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    Jasně, já jen čekal že Perl při počítání s undef-em buď hodí výjimku (ala Python), nebo aspoň garantuje že výsledek bude zase undef (ala SQL). Ale on to vesele zkonvertuje na nulu a směje se....
    Je to součástí specifikace. Co by jste chtěl, když je tvůrcem jazykovědec a ne matematik? Prostě si na to musíte zvyknnout a nebo používat něco jiného.
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    Marián Kyral avatar 2.2.2007 15:21 Marián Kyral | skóre: 29 | blog: Sem_Tam | Frýdek-Místek
    Rozbalit Rozbalit vše Re: Perlová magie 2 aneb zákeřnost
    ???

    Perl neumím, ale když vidím ten podivný kód a výraz materializovat, tak mě taky napadlo něco podobného.
    2.2.2007 15:58 zde | skóre: 9 | blog: Linuch | Brno
    Rozbalit Rozbalit vše Jo a máte tam chybu :)
    ale funkce scalar vyhodnotí pouze výsledek poslední funkce.

    Vyhodnotí se OBĚ funkce (jako skaláry), ale vrátí se jen výsledek té druhé. Zřejmě se tak Perl snaží napodobovat chování operátoru "," z C. To že tím vznikne sémantický rozdíl mezi vyhodnocováním listu (ala C) a vyhodnocováním proměnné obsahující ten identický list (ala length), je FAKT zábavné. No, ono ostatně používání scalar pro zjišťování délky listu bylo braindamaged samo o sobě, tímhle se to jen vylepšilo :)

    Je nutné to pole materializovat a potom se to chová správně.

    Aneb přístup když ti tvůj program v Perlu nefunguje, napiš identický algoritmus znovu, ale na víc řádků, s více dočasnými proměnnými, a s méně závorkami. :) :) :)
    Táto, ty de byl? V práci, já debil.
    2.2.2007 16:19 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Jo a máte tam chybu :)
    ale funkce scalar vyhodnotí pouze výsledek poslední funkce.

    Vyhodnotí se OBĚ funkce (jako skaláry), ale vrátí se jen výsledek té druhé. Zřejmě se tak Perl snaží napodobovat chování operátoru "," z C. To že tím vznikne sémantický rozdíl mezi vyhodnocováním listu (ala C) a vyhodnocováním proměnné obsahující ten identický list (ala length), je FAKT zábavné.
    O vašich informacích se dá z úspěchem pochybovat. (Zkráceně: kecáte.) Perl nic takového jako operátor "," z C nezná a nikdy se tak nechová. Ba právě naopak:
    perl -le '$,=", "; @a = 1,2; print @a'
    Je nutné to pole materializovat a potom se to chová správně.

    Aneb přístup když ti tvůj program v Perlu nefunguje, napiš identický algoritmus znovu, ale na víc řádků, s více dočasnými proměnnými, a s méně závorkami. :) :) :)
    Originál:
    sub b {
       a($_[0]), a($_[1])
    }
    Řešení:
    sub b {
       @{[a($_[0]), a($_[1])]}
    }
    Alternativní řešení:
    sub b {
       my @res = (a($_[0]), a($_[1]))
    }
    
    Ani v jednom případě se počet závorek nezmenšil a jen jedna alternativa potřebuje víc proměnných. Fakt je mi vás líto, jestli programovat v Perlu opravdu musíte. Já bych s takovým trvalým rozčarováním pracovat nemohl.
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    2.2.2007 16:27 zde | skóre: 9 | blog: Linuch | Brno
    Rozbalit Rozbalit vše Re: Jo a máte tam chybu :)
    ad 1) Zkráceně: nekecám.
    $ perl -le 'sub a {print shift;} print scalar (a(1), a(2), 5)'
    1
    2
    5
    
    ad 2) Ano, máte pravdu. Opravu lze provést i přidáním závorek, aniž by se zvyšoval počet řádků nebo pomocných proměnných.
    Táto, ty de byl? V práci, já debil.
    2.2.2007 16:48 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Jo a máte tam chybu :)
    ad 1) Zkráceně: nekecám.
    $ perl -le 'sub a {print shift;} print scalar (a(1), a(2), 5)'
    1
    2
    5
    
    Beru zpět, nekecáte. Teď jsem se na to díval a fakt ten operátor má a chová se stejně jako v C, ale jen v skalárním kontextu. To jeho podivné chování se jak na potvoru projeví tak zřítka, že jsem ho dodnes úspěšně ignoroval. Jak na potvoru právě scalar to skalární chování operátoru čárky vynutí.
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.

    Založit nové vláknoNahoru

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