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 16:11 | Nová verze

    Bylo vydáno openSUSE Leap 16 (cs). Ve výchozím nastavení přichází s vypnutou 32bitovou (ia32) podporou. Uživatelům však poskytuje možnost ji ručně povolit a užívat si tak hraní her ve Steamu, který stále závisí na 32bitových knihovnách. Změnily se požadavky na hardware. Leap 16 nyní vyžaduje jako minimální úroveň architektury procesoru x86-64-v2, což obecně znamená procesory zakoupené v roce 2008 nebo později. Uživatelé se starším hardwarem mohou migrovat na Slowroll nebo Tumbleweed.

    Ladislav Hagara | Komentářů: 0
    dnes 16:00 | IT novinky

    Ministerstvo průmyslu a obchodu (MPO) ve spolupráci s Národní rozvojovou investiční (NRI) připravuje nový investiční nástroj zaměřený na podporu špičkových technologií – DeepTech fond. Jeho cílem je posílit inovační ekosystém české ekonomiky, rozvíjet projekty s vysokou přidanou hodnotou, podpořit vznik nových technologických lídrů a postupně zařadit Českou republiku mezi země s nejvyspělejší technologickou základnou.

    … více »
    Ladislav Hagara | Komentářů: 0
    dnes 12:55 | Nová verze

    Radicle byl vydán ve verzi 1.5.0 s kódovým jménem Hibiscus. Jedná se o distribuovanou alternativu k softwarům pro spolupráci jako např. GitLab.

    Ladislav Hagara | Komentářů: 2
    dnes 03:22 | IT novinky

    Společnost OpenAI představila text-to-video AI model Sora 2 pro generování realistických videí z textového popisu. Přesnější, realističtější a lépe ovladatelný než předchozí modely. Nabízí také synchronizované dialogy a zvukové efekty.

    Ladislav Hagara | Komentářů: 4
    včera 23:11 | Nová verze

    UBports, nadace a komunita kolem Ubuntu pro telefony a tablety Ubuntu Touch, vydala Ubuntu Touch 24.04-1.0, tj. první stabilní vydání založené na Ubuntu 24.04 LTS.

    Ladislav Hagara | Komentářů: 0
    včera 21:00 | Komunita

    Rakouská armáda přechází na LibreOffice. Ne kvůli licencím (16 000 počítačů). Hlavním důvodem je digitální suverenita. Prezentace v pdf z LibreOffice Conference 2025.

    Ladislav Hagara | Komentářů: 23
    včera 12:44 | Bezpečnostní upozornění

    Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB) upozorňuje na sérii kritických zranitelností v Cisco Adaptive Security Appliance (ASA) a Firepower Threat Defense (FTD) a Cisco IOS, CVE-2025-20333, CVE-2025-20363 a CVE-2025-20362. Zneužití těchto zranitelností může umožnit vzdálenému neautentizovanému útočníkovi spustit libovolný kód (RCE). Společnost Cisco uvedla, že si je vědoma aktivního zneužívání těchto zranitelností.

    Ladislav Hagara | Komentářů: 16
    včera 12:11 | IT novinky

    Ochrana uživatelů a zároveň příznivé podmínky pro rozvoj umělé inteligence (AI). Ministerstvo průmyslu a obchodu (MPO) připravilo minimalistický návrh implementace evropského nařízení o umělé inteligenci, tzv. AI aktu. Český zákon zajišťuje ochranu občanům a bezpečné používání AI, ale zároveň vytváří pro-inovační prostředí, ve kterém se může AI naplno rozvíjet, firmy mohou využít jeho potenciál a nebudou zatíženy zbytečnou administrativou. Návrh je nyní v meziresortním připomínkovém řízení.

    Ladislav Hagara | Komentářů: 8
    včera 05:11 | Komunita

    Dle plánu Linus Torvalds odstranil souborový systém bcachefs z mainline Linuxu. Tvůrce bcachefs Kent Overstreet na Patreonu informuje, že bcachefs je nově distribuován jako DKMS modul.

    Ladislav Hagara | Komentářů: 2
    29.9. 17:44 | IT novinky

    PIF, Silver Lake a Affinity Partners kupují videoherní společnost Electronic Arts (EA) za 55 miliard dolarů (1,14 bilionu korun).

    Ladislav Hagara | Komentářů: 2
    Jaké řešení používáte k vývoji / práci?
     (39%)
     (48%)
     (12%)
     (14%)
     (17%)
     (14%)
     (18%)
     (14%)
     (14%)
    Celkem 146 hlasů
     Komentářů: 9, poslední 24.9. 17:28
    Rozcestník

    Perlová magie 2 aneb zákeřnost

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