abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 21:22 | Nová verze

    Armbian, tj. linuxová distribuce založená na Debianu a Ubuntu optimalizovaná pro jednodeskové počítače na platformě ARM a RISC-V, ke stažení ale také pro Intel a AMD, byl vydán ve verzi 24.5.1 Havier. Přehled novinek v Changelogu.

    Ladislav Hagara | Komentářů: 0
    dnes 19:44 | IT novinky

    Společnost xAI založena Elonem Muskem a stojící za AI LLM modelem Grok získala investici 6 miliard dolarů.

    Ladislav Hagara | Komentářů: 0
    dnes 15:44 | IT novinky

    Finálový zápas mistrovství světa v ledním hokeji přinesl nový rekord NIX.CZ (𝕏): "Dosavadní absolutní maximum našeho propojovacího uzlu bylo překonáno v čase 21:10, kdy jsme při přenosu dat dosáhli 3,14 Tbps. Je třeba také doplnit, že po deváté hodině večerní byly na maximu i ostatní datové přenosy nesouvisející s hokejovým šampionátem".

    Ladislav Hagara | Komentářů: 1
    dnes 15:11 | Pozvánky

    Přihlaste svou přednášku na další ročník konference LinuxDays, který proběhne 12. a 13. října na FIT ČVUT v pražských Dejvicích. CfP poběží do konce prázdnin, pak proběhne veřejné hlasování a výběr přednášek.

    Petr Krčmář | Komentářů: 0
    25.5. 19:00 | Zajímavý projekt

    Na crowdsourcingové platformě Crowd Supply byla spuštěna kampaň na podporu open source biometrického monitoru ve tvaru hodinek HealthyPi Move. Cena je 249 dolarů a plánovaný termín dodání listopad letošního roku.

    Ladislav Hagara | Komentářů: 13
    24.5. 22:22 | Upozornění Ladislav Hagara | Komentářů: 21
    24.5. 17:44 | Nová verze

    Firma Murena představila /e/OS verze 2.0. Jde o  alternativní sestavení Androidu bez aplikací Google. Mezi novinkami je podrobnější nastavení ochrany soukromí před sledováním aplikacemi. Murena prodává několik smartphonů s předinstalovaným /e/OS (Fairphone, repasovaný Google Pixel 5).

    Fluttershy, yay! | Komentářů: 0
    24.5. 14:33 | Zajímavý software

    Do 30. května lze v rámci akce Warhammer Skulls 2024 získat na Steamu zdarma hru Warhammer 40,000: Gladius - Relics of War.

    Ladislav Hagara | Komentářů: 1
    24.5. 13:33 | Nová verze

    HelenOS (Wikipedie), tj. svobodný operační systém českého původu založený na architektuře mikrojádra, byl vydán ve verzi 0.14.1. Přehled novinek v poznámkách k vydání. Vypíchnou lze nabídku Start. Videopředstavení na YouTube.

    Ladislav Hagara | Komentářů: 3
    23.5. 23:22 | Zajímavý software

    BreadboardOS je firmware pro Raspberry Pi Pico (RP2040) umožňující s tímto MCU komunikovat pomocí řádkového rozhraní (CLI). Využívá FreeRTOS a Microshell.

    Ladislav Hagara | Komentářů: 0
    Podle hypotézy Mrtvý Internet mj. tvoří většinu online interakcí boti.
     (89%)
     (3%)
     (4%)
     (4%)
    Celkem 875 hlasů
     Komentářů: 16, poslední 14.5. 11:05
    Rozcestník

    Perlová magie 2 aneb zákeřnost

    2.2.2007 14:42 | Přečteno: 1379× | 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.