Hlavní navigace

Názor k článku Perličky (2) od Jenda - 1) "speciální znak "=>" je pouze náhražkou za...

  • Článek je starý, nové názory již nelze přidávat.
  • 8. 12. 2001 16:20

    Jenda (neregistrovaný)

    1) "speciální znak "=>" je pouze náhražkou za čárku, kterou si tam Perl potom stejně dá."

    Ovsem jisty maly ale podstatny rozdil mezi => a carkou tu prece jen je. Zkuste tohle :

    %OK = (time => '15:30');
    %BAD = (time, '15:30');

    foreach (keys %OK) {print "OK: $_ => $OK{$_}\n"}
    foreach (keys %BAD) {print "BAD: $_ => $BAD{$_}\n"}

    => totiz na rozdil od carky zaridi to, ze pokud ta vec pred nim vypada jako slovo tak se bude brat jako retezec a ne jako volani funkce.

    2) "otázkou zůstává, co bude interpret říkat na to, když se pokusíme hash inicializovat lichým počtem prvků. ... nebude z toho moc nadšen, něco zabrumlá, ale program fungovat bude."

    Tohle zavisi na tom jestli mate zapnute warningy. Coz byste samozrejme meli ;-)

    3) "V Perlu rozeznáváme dva kontexty: skalární a seznamový. "

    A pak jeste prazdny, ciselny a logicky. I kdyz ten ciselny a logicky wantarrayem nezjistite :

    sub test {
    print "wantaray=".wantarray()."\n";
    print "wantarray ".(defined wantarray() ? "" : "not ")."defined\n";
    };

    print "LIST\n";
    @a = test();

    print "SCALAR\n";
    $a = test;

    print "VOID\n";
    test();

    Ciselny a logicky kontext zpusobuje urcite konverze.

    4) Konstanty : "nejpřirozenější je vytvořit si funkci,
    která prostě vrátí hodnotu"
    sub PI { 3.1415 };

    Lepsi je napsat to takhle :

    sub PI () { 3.1415927}

    ty kulate zavorky znamenaji, ze tato funkce nikdy nebere zadne parametry. A optimalizator zaridi, ze se ve skutecnosti zadna funkce volat nebude (jako inline funkce v C). A nehrozi vam potom, ze misto toho aby k PI nevo pricetl zavola funkci PI a da ji to cislo jako parametr.

    Zkuste
    print PI + 5;
    postupne s obema definicema.

    Z tohoto je jasne, ze
    use constant PI => 3.1415927;
    toho dela o malicko vic, nez ze nadefinuje funkci.

    5) Typegloby

    Podle me je lepsi existenci typeglobu zatajit. Prinejmensim zacatecnikum.

    Pokud chcete predavat ovladace souboru nebo mit jistotu, ze vam ten vas ovladac nejaka jina funkce neprepise pak je spravny postup :

    use FileHandle;
    sub mySub {
    ...
    my $FH;
    open $FH, $filename or die "can't open: $!\n";
    mySubSub(1,2,3,$FH);
    close $FH;
    }

    Tohle je mnohem bezpecnejsi nez hrat si s typegloby.

    6) "To není překlep, protože funkce return volaná bez parametrů implicitně vrací nepravdu. Mohli byste tedy napsat "return 0;" -- je to to samé v bledě modrém."

    To tedy setsakra neni, jedine v logickem kontextu. Zkuste si vytisknout navratovou hodnotu te funkce ;-) Dokonce ani
    return undef;
    neni to same co
    return;

    Zkuste si :
    sub Undef {return undef}
    sub Nic {return}
    @Undef = Undef;
    @Nic = Nic;
    print "Undef's true\n" if @Undef;
    print "Nic's true\n" if @Nic;

    7) in_gen_Ir: "return 0 is true;
    se v numerickem kontextu vyhodnoti jako normalni nula, je-li vsak pouzita v podmince a tim v bool-kontextu, tak jako true"

    Coz se v soucasnem Perlu obvykle pise
    return "0 but true";
    ;-)

    Hnidopich Jenda ;-)

    P.S.: Jen pis dal Lukasi, nenech se otravit! Ja si nikdy nemuzu nechat ujit prilezitost se trosku vykecavat ;-)