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í
×
    včera 05:00 | Nová verze

    Byla vydána beta verze Linux Mintu 22.3 s kódovým jménem Zena. Podrobnosti v přehledu novinek a poznámkách k vydání. Vypíchnout lze, že nástroj Systémová hlášení (System Reports) získal mnoho nových funkcí a byl přejmenován na Informace o systému (System Information). Linux Mint 22.3 bude podporován do roku 2029.

    Ladislav Hagara | Komentářů: 2
    včera 01:55 | Nová verze

    GNU Project Debugger aneb GDB byl vydán ve verzi 17.1. Podrobný přehled novinek v souboru NEWS.

    Ladislav Hagara | Komentářů: 0
    19.12. 17:22 | IT novinky

    Josef Průša oznámil zveřejnění kompletních CAD souborů rámů tiskáren Prusa CORE One a CORE One L. Nejsou vydány pod obecnou veřejnou licenci GNU ani Creative Commons ale pod novou licencí OCL neboli Open Community License. Ta nepovoluje prodávat kompletní tiskárny či remixy založené na těchto zdrojích.

    Ladislav Hagara | Komentářů: 14
    19.12. 17:00 | Komunita

    Nový CEO Mozilla Corporation Anthony Enzor-DeMeo tento týden prohlásil, že by se Firefox měl vyvinout v moderní AI prohlížeč. Po bouřlivých diskusích na redditu ujistil, že v nastavení Firefoxu bude existovat volba pro zakázání všech AI funkcí.

    Ladislav Hagara | Komentářů: 0
    19.12. 10:11 | IT novinky

    V pořadí šestou knihou autora Martina Malého, která vychází v Edici CZ.NIC, správce české národní domény, je titul Kity, bity, neurony. Kniha s podtitulem Moderní technologie pro hobby elektroniku přináší ucelený pohled na svět současných technologií a jejich praktické využití v domácích elektronických projektech. Tento knižní průvodce je ideální pro každého, kdo se chce podívat na současné trendy v oblasti hobby elektroniky, od

    … více »
    Ladislav Hagara | Komentářů: 8
    19.12. 03:11 | Komunita

    Linux Foundation zveřejnila Výroční zprávu za rok 2025 (pdf). Příjmy Linux Foundation byly 311 miliónů dolarů. Výdaje 285 miliónů dolarů. Na podporu linuxového jádra (Linux Kernel Project) šlo 8,4 miliónu dolarů. Linux Foundation podporuje téměř 1 500 open source projektů.

    Ladislav Hagara | Komentářů: 0
    19.12. 02:11 | Zajímavý článek

    Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.12.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.

    Ladislav Hagara | Komentářů: 0
    19.12. 02:00 | Nová verze

    OpenZFS (Wikipedie), tj. implementace souborového systému ZFS pro Linux a FreeBSD, byl vydán ve verzi 2.4.0.

    Ladislav Hagara | Komentářů: 0
    19.12. 01:00 | IT novinky

    Kriminalisté z NCTEKK společně s českými i zahraničními kolegy objasnili mimořádně rozsáhlou trestnou činnost z oblasti kybernetické kriminality. V rámci operací OCTOPUS a CONNECT ukončili činnost čtyř call center na Ukrajině. V prvním případě se jednalo o podvodné investice, v případě druhém o podvodné telefonáty, při kterých se zločinci vydávali za policisty a pod legendou napadeného bankovního účtu okrádali své oběti o vysoké finanční částky.

    Ladislav Hagara | Komentářů: 9
    18.12. 14:44 | IT novinky

    Na lepší pokrytí mobilním signálem a dostupnější mobilní internet se mohou těšit cestující v Pendolinech, railjetech a InterPanterech Českých drah. Konsorcium firem ČD - Telematika a.s. a Kontron Transportation s.r.o. dokončilo instalaci 5G opakovačů mobilního signálu do jednotek Pendolino a InterPanter. Tento krok navazuje na zavedení této technologie v jednotkách Railjet z letošního jara.

    Ladislav Hagara | Komentářů: 8
    Kdo vám letos nadělí dárek?
     (27%)
     (2%)
     (13%)
     (2%)
     (2%)
     (2%)
     (10%)
     (25%)
     (17%)
    Celkem 48 hlasů
     Komentářů: 15, poslední dnes 09:50
    Rozcestník

    Perlová magie 2 aneb zákeřnost

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