d3xter@jabberpl.org

Załaduj moduł albo i nie

Dodano 04 grudnia 2009 o 22:19:41 w kategorii Ogólne, Techblog, Wirtualnie / Perl
-----------

Z cyklu: małe, ale użyteczne.

Na Planet Perl Yuval Kogman zaproponował jak zaimplementować metodę w zależności od tego czy udało się wcześniej załadować jakiś moduł, czy nie. Jego implementacja wykorzystuje moduł Try::Tiny, który jest takim ulepszonym eval, który wykonuje warunkowo require:

  try { require SomeModule; 1 };

Przypomniałem sobie, że przecież właśnie w tym celu stworzyłem moduł maybe, który nie dość, że działa na etapie kompilacji kodu Perla, to jeszcze udostępnia stałą wartość, która pozwala zoptymalizować blok kodu także na etapie kompilacji.

Działa to tak:

  use maybe 'Carp' => 'confess';

  if (maybe::HAVE_CARP) {
      confess("Bum!");
  }
  else {
      die("Bum!");
  }

Jak można sobie sprawdzić za pomocą B::Concise, w zależności od tego, czy moduł istnieje, to skompiluje się albo to co jest po if, albo to co jest po else. Jeżeli zamiast stałej, użyjemy wywołania metody maybe->HAVE_CARP, to skompilują się obydwa bloki, a to, który się wykona, rozstrzygnie się na etapie wykonywania kodu, a nie kompilacji.

Oczywiście w powyższym przypadku optymalizacja nie jest potrzebna, ale jeśli dane wyrażenie wykona się np. kilkaset razy na sekundę, to już to będzie miało znaczenie.

Dodaj komentarz.