Jako, że od jakiegoś czasu zajmuję się perlem, to zależy mi na wynajdywaniu różnych użytecznych sztuczek i/lub informacji dotyczących tego języka. Poniżej zbiór kilku różnych porad, które jakoś się w ostatnim czasie uzbierały :)

  1. ciekawostka: używanie konstrukcji while-each do iteracji po elementach hasza jest wolniejsze niż używanie pary for-keys! Zrobiłem sobie jakiś czas temu do tego prostego benchmarka. Różnica prędkości nie jest duża, wacha się w granicach błędu (3-4%), ale zawsze jest to coś, tym bardziej, że for-keys pozwala na przeiterowanie po elementach hasza w jakiejś dowolnej, określonej przez nas kolejności :)
  2. często jest tak, że jakaś funkcja zwraca nam tablicę elementów, a my potrzebujemy tej referencji do tej tablicy. najprostszym, i do niedawna najczęściej przeze mnie używanym sposobem było zrobienie:
    @$ref = funkcja_zwracajaca_tablice();

    Od niedawna, używam konstrukcji:

    $ref = [funkcja_zwracajaca_tablice()];

    wzrost prędkości sięga nawet 40%!

  3. Powyższa reguła dotyczy także haszy, czyli nie:
    %$ref = funkcja_zwracajaca_hasz();

    tylko

    $ref = {funkcja_zwracajaca_hasz()};
  4. tutaj taki ogólny tips: po co duplikować kod, pisząc:
    $var1 = ($var2 eq 'aaa') ? 1 : 0;

    skoro można zapisać to w skrócie:

    $var1 = ($var2 eq 'aaa');

    ? Bardzo często spotykam się z takim bzdurnym zapisem jak ten pierwszy - pamiętaj że narzuca to dodatkowe wykonanie warunku…

  5. Uwielbiam w perlu prawostronne warunki/pętle. Po prostu strasznie upraszczają zapis, zwiększając przy tym czytelność (oczywiście wszystko jest łatwo nadużyć, ale to osobna kwestia). Przy pętlach brakowało mi strasznie możliwości iterowania z jakimś warunkiem, i wykonania jakiejś akcji gdy warunek jest spełniony. Jak zwykle niezastąpiony bochen znalazł i na to radę:
    ($_%2) and $_ foreach (1..6);

    Co prawda powyższy zapis łatwo zastąpić grepem, ale nie zawsze potrzebujemy otrzymać tablicę wartości, czasem trzeba tylko wykonać jakąś akcję :)

  6. Spotykałem się czasem z problemem przekazywania nazwy funkcji, jaką trzeba wykonać, w zmiennej. Nie zawsze można przekazać referencję do tej funkcji, a na pewno nie zawsze jest to najwygodniejsze co możemy użyć. No i oczywiście pomijam tutaj użycie evala. Metody na rozwiązanie tego problemu są dwie, przy czym preferuję drugą, gdyż nie ponosimy przy tym ryzyka wystąpienia jakichś błędów przy wyłączonym “strict refs”.
    sub test { print 'testujemy'; }
    my $t = 'test';
    • {
          no strict "refs";
          &{$test}();
      }
    • &{*fn = $test}();

    Należy jednak pamiętać że metoda “z globem” jest nawet do 30% wolniejsza od wersji z “no strict refs” (20% jeśli włączymy zaraz na początku wywoływanej w ten sposób funkcji “use strict refs”).

Jeśli macie jeszcze jakieś ciekawostki związane z perlem, to poproszę o linki/konkrety w komentarzach :)


Będzie wyjątkowo nietechnicznie ;) Ale chyba wiosna idzie. W sumie co się dziwić, już połowa lutego ;)

Wiosna - Krokusy1Wiosna - Krokusy3Wiosna - Krokusy5Wiosna - Krokusy6

UPDATE:

Wiosna5Wiosna4Wiosna3
Wiosna2Wiosna1