Inne

Perl FAQ | RecentChanges | Preferences

1. Jak sprawdzić czas i datę?
2. Do czego służy my/local?
3. Jak wygenerować salt?
4. Jak zamienić bin na hex?
5. Czym obsłużyć porty szeregowe?
6. Jak wczytać jeden klawisz?
7. Jak zakomentować większy fragment?
8. Jak stworzyć moduł (package)?
9. Jak czytać pliki konfiguracyjne?
10. Jak porównać szybkość kodu?
11. Gdzie jest skrypt do DVD?
12. Ile kosztuje skrypt w Perlu?
13. Co to jest golf?
14. Jak rozszyfrować niezrozumiały zapis?
15. A jak go zrobić?

1. Jak sprawdzić czas i datę?

Liczba sekund od 01.01.1970:

 time

Postać tekstowa lub wydzielona na poszczególne pola:

 localtime(time) lub po prostu localtime

W MS Excelu stosuje się zapis liczba_dni.liczba_sekund. Konwersja takiego zapisu to np.

 print ~~gmtime 86400*(38685.46798-25567), "\n";

Postać tekstowa zależna od języka z możliwością konfiguracji:

  use POSIX qw(strftime);
  $now_string = strftime "%a %b %e %H:%M:%S %Y", localtime;

W języku polskim wystarczy dodać na początku

  use locale;

Bardziej poprawnie gramatycznie (bo w dopełniaczu):

 ($mday,$mon,$year) = (localtime)[3..5];
 $todaydate = ($mday) . " " .
   (qw(stycznia lutego marca kwietnia maja czerwca lipca 
    sierpnia września października listopada grudnia))[$mon]
   . " " . ($year+1900);

Pożyteczne funkcje do czasu (daty) są w modułach Time::ParseDate, Date::Calc, Date::Parse oraz Date::Manip.

Np. różnica sekund:

 use Date::Parse;
 my $data1 = '2006-08-31 07:25:14';
 my $data2 = '2006-08-31 07:25:17';
 print  str2time($data2)-str2time($data1);

Funkcja odwrotna do localtime to timelocal:

 use Time::Local;
 $liczbasek = timelocal($sek,$min,$godz,$dzien,$mies,$rok);

Do operacji na czasie w milisekundach służy moduł Time::HiRes.

2. Do czego służy my/local?

Funkcja my służy do deklaracji zmiennej i nadanie jej bardzo lokalnego kontekstu (w przeciwnieństwie do local $zmienna, który jest lokalny nie do końca).

My ogranicza zasięg zmiennych będących jej argumentami do bieżacego bloku funkcji eval{}, procedury lub zaimportowanego pliku.

Tak zadeklarowane zmienne są z reguły ciut szybsze niż normalne - globalne.

3. Jak wygenerować salt?

 $salt = join '',('A'..'Z','a'..'z','0'..'9','.','/')[rand 64,rand 64];

4. Jak zamienić bin na hex?

  $text = join "", unpack "H*", $text;

5. Czym obsłużyć porty szeregowe?

Device::SerialPort (lub POSIX::Termios do terminali) na uniksach i Win32::SerialPort na tym drugim.

6. Jak wczytać jeden klawisz?

Można użyć Term::ReadKey, np. z czasem oczekiwania 10 sekund:

 use Term::ReadKey; my $key = ReadKey(10);

7. Jak zakomentować większy fragment?

Przydatne jest tu stosowanie elemetów POD-a:

 =tu start komentarza
 komentarz
 koniec
 =cut

8. Jak stworzyć moduł (package)?

Moduł to inaczej pakiet lub biblioteka. Ogólnie konstrukcja jest następująca (plik Test.pm):

 package Test;
 use potrzebny_modul;

 sub moja_funkcja { 
   return "Jest OK";        # slowo return jest tu zbedne
 }

 1;

Dostęp do argumentów wywołania tradycyjnie przez wektor @_, przy czym element o indeksie 0, posiada referencję do pakietu

Wywołanie funkcji musi się odbywać w odniesieniu do pakietu:

 Test::moja_funkcja();

lub

 use Test;
 $zwrot=Test->moja_funkcja;      # w zmiennej zwrot bedzie "Jest OK"

Jeżeli jednak chcesz żeby Twój pakiet udostępniał jakieś zmienne/funkcje bezpośrednio w pakiecie w którym został użyty (zwykle - w pakiecie main), wtedy właśnie używasz Exportera. Powoduje on, że to co podasz w tablicy @EXPORT jest w trakcie wykonywania use Moduł; eksportowane, czyli jest tworzone coś w rodzaju aliasu wskazującego na nazwę w Twoim pakiecie.

I np. jeżeli napiszesz na początku programu use POSIX, to moduł POSIX

 wyeksportuje nazwę strftime() (i wiele innych), czyli jeżeli później
użyjesz funkcji strftime() to tak naprawdę zostanie wywołana funkcja POSIX::strftime().

Przydatne manuale: perlmod i perlmodlib, oraz perlboot, perltoot, perltootc, perlobj, perlbot (w takiej kolejności)

9. Jak czytać pliki konfiguracyjne?

Poleca się moduł Config::General. Czyta, parsuje i zapisuje pliki w stylu konfiguracji Apache'a. W prostszych zastosowaniach wystarcza Config::Tiny.

10. Jak porównać szybkość kodu?

Do tego celu stworzono moduł Benchmark:

 use Benchmark qw(cmpthese);
 cmpthese($ile_razy, {
               'nazwa1' => sub { ...kod1... },
               'nazwa2' => sub { ...kod2... },
           });          

11. Gdzie jest skrypt do DVD?

7 linijek, 526 znaków:

 http://www.wired.com/news/culture/0,1284,42259,00.html?tw=wn20010307

 $_='while(read+STDIN,$_,2048){$a=29;$b=73;$c=142;$t=255;@t=map{$_%16or$t^=$c^=(
 $m=(11,10,116,100,11,122,20,100)[$_/16%8])&110;$t^=(72,@z=(64,72,$a^=12*($_%16
 -2?0:$m&17)),$b^=$_%64?12:0,@z)[$_%8]}(16..271);if((@a=unx"C*",$_)[20]&48){$h
 =5;$_=unxb24,join"",@b=map{xB8,unxb8,chr($_^$a[--$h+84])}@ARGV;s/...$/1$&/;$
 d=unxV,xb25,$_;$e=256|(ord$b[4])<<9|ord$b[3];$d=$d8^($f=$t&($d12^$d4^
 $d^$d/8))<<17,$e=$e8^($t&($g=($q=$e14&7^$e)^$q*8^$q<<6))<<9,$_=$t[$_]^
 (($h=8)+=$f+(~$g&$t))for@a[128..$#a]}print+x"C*",@a}';s/x/pack+/g;eval 

12. Ile kosztuje skrypt w Perlu?

Większość skryptów dostępna jest bezpłatnie (p. rozdział drugi), lecz są one dobre w typowych zastosowaniach. Niekiedy konieczne jest ich dostosowanie, lub wręcz przepisanie. Najlepiej wtedy oszacować potrzebny czas i na tej podstawie wyceniać skrypty.

13. Co to jest golf?

Jest to konkurs pl.comp.lang.perl - golf. Zwycięzcą każdej edycji konkursu (golfa) jest osoba, której uda się napisać program realizujący zadaną funkcję w minimalnej liczbie znaków. Trwa zazwyczaj tydzień. Na grupie podaje się swoje wyniki, a rozwiązanie przedstawia po zakończeniu konkursu.

Niedozwolone jest: wykorzystywanie modułów nie należących do standardowej dystrybucji perla, wykorzystywanie funkcji działających tylko w określonym otoczeniu, wykorzystywanie wiedzy innych.

Liczba znaków liczona jest bez ścieżki do perla (#!.*perl). Tiebreaker to dodatkowa puktacja przy tej samej liczbie. Ostateczny wynik podaje się odzielając kropką (np. 99.61). Przy tych samych wynikach decyduje kolejność zgłoszeń.

Odsyłacze:

 http://kernelpanic.pl/perlgolf-list.mx              [pclp #4 i dalsze]
 http://www.ceti.pl/~kompas/golf/                    [pclp #3]
 http://golf.negativeiq.pl/                          [pclp #1 i #2]
 http://www.xs4all.nl/~thospel/golf/rules.html       [ogólne reguły]
 http://perlgolf.sourceforge.net/       [rozwiązania]
 http://terje.dev.webon.net/golf/       [rozwiązania]
 http://perlmonks.org/index.pl?node=Obfuscated%20Code  [rozwiązania]
 http://archive.develooper.com/golf@perl.org/      [dyskusje]

14. Jak rozszyfrować niezrozumiały zapis?

Problem dotyczy sygnaturek oraz rozwiązań golfa. Można to zrobić uruchamiając problematyczny kod programu w jeden z następujących sposobów.

 perl -MO=Deparse -e 'kod'
 perl -MO=Deparse skrypt.pl

15. A jak go zrobić?

Patrz do golfa albo na moduł Acme::EyeDrops.

Perl FAQ | RecentChanges | Preferences
This page is read-only | View other revisions
Last edited August 31, 2006 3:33 pm by Juszkiew (diff)
Search:
Strona znajduje się na serwerze KT AGH.