SlideShare a Scribd company logo
1 of 29
Download to read offline
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TRE CI   Perl
           KATALOG KSI¥¯EK               Autor: Reuven M. Lerner
                                         T³umaczenie: M. Michalski, S. Dzieniszewski
                      KATALOG ONLINE     ISBN: 83-7361-169-X
                                         Tytu³ orygina³u: Core Perl
       ZAMÓW DRUKOWANY KATALOG           Format: B5, stron: 45
                                         Przyk³ady na ftp: 61 kB

              TWÓJ KOSZYK
                    DODAJ DO KOSZYKA     Ten kompletny przewodnik po Perlu szybko i wygodnie dostarcza do wiadczonym
                                         programistom odpowiednich technik i ilustruj¹cych je praktycznych przyk³adów kodu.
                                         Lektura tej ksi¹¿ki pozwoli Ci najpierw rozwin¹æ swoje dotychczasowe umiejêtno ci,
         CENNIK I INFORMACJE             a nastêpnie zg³êbiæ tajniki podstawowych technik programowania w Perlu. Ksi¹¿ka
                                         rozpoczyna siê opisem podstawowej sk³adni jêzyka, przechodzi pó niej do obiektów,
                   ZAMÓW INFORMACJE      struktur danych i zasad przetwarzania tekstu. Nastêpnie wyja nia, jak korzystaæ
                     O NOWO CIACH        z dostarczonych przez Perl narzêdzi umo¿liwiaj¹cych pracê z plikami, dzia³anie
                                         programów w sieci czy wspó³pracê z relacyjnymi bazami danych. Na koniec pokazuje,
                       ZAMÓW CENNIK      jak wykorzystaæ pe³niê mo¿liwo ci Perla podczas tworzenia aplikacji WWW — zarówno
                                         prostych skryptów CGI, jak i w pe³ni zaawansowanych narzêdzi obs³uguj¹cych
                                         witryny WWW.
                 CZYTELNIA               Opisano miêdzy innymi:
                                            • Typy danych i podstawowe funkcje Perla
          FRAGMENTY KSI¥¯EK ONLINE          • Zasady pisania i korzystania z modu³ów Perla
                                            • Sposoby korzystania z plików tekstowych i plików DBM
                                            • Interfejs DBI pozwalaj¹cy na korzystanie z baz danych i integrowanie baz danych
                                              ze stronami WWW
                                            • Programy CGI, modu³y mod_perl dla serwera Apache, cookie protoko³u HTTP
                                              oraz szablony HTML/Perla
                                            • Mason: oparty na Perlu system tworzenia zaawansowanych witryn WWW
                                            • Wykrywanie i usuwanie b³êdów, optymalizacja kodu oraz sprawy zwi¹zane
                                              z bezpieczeñstwem
                                         Od wielu ju¿ lat programi ci na ca³ym wiecie doceniaj¹ Perla za jego prostotê, wygodê
                                         i uniwersaln¹ zdolno æ do rozwi¹zywania szerokiego zakresu problemów; pocz¹wszy
Wydawnictwo Helion                       od przetwarzania tekstu i administrowania systemem operacyjnym po komunikacjê
ul. Chopina 6                            z bazami danych i tworzenie stron WWW. Ksi¹¿ka „Perl” dostarcza programistom
44-100 Gliwice                           wiedzy niezbêdnej do tworzenia wszechstronnych, przejrzystych i bardzo wydajnych
tel. (32)230-98-63                       programów — niezale¿nie jakie bêd¹ zadania tworzonych przez niego aplikacji.
e-mail: helion@helion.pl
Spis treści

Przedmowa .................................................................................................................................................. 9

Rozdział 1. Czym jest Perl? ........................................................................................................................15
     1.1. Czym jest Perl?...................................................................................................... 15
     1.2. Do czego Perl się nie nadaje? ................................................................................. 17
     1.3. Licencje ................................................................................................................ 17
     1.4. Wersje i standardy Perla......................................................................................... 18
     1.5. Wsparcie techniczne .............................................................................................. 18
     1.6. Pobieranie i instalacja Perla.................................................................................... 19
     1.7. Pobieranie modułów z CPAN ................................................................................... 22
     1.8. Podsumowanie ...................................................................................................... 25

Rozdział 2. Pierwsze kroki ....................................................................................................................... 27
     2.1. Najprostsze programy............................................................................................. 28
     2.2. Kompilator czy interpreter? ..................................................................................... 29
     2.3. Wyrażenia i bloki.................................................................................................... 30
     2.4. Zmienne................................................................................................................ 31
     2.5. Skalary ................................................................................................................. 32
     2.6. Listy i tablice ......................................................................................................... 41
     2.7. Tablice asocjacyjne ................................................................................................ 48
     2.8. Odwołania ............................................................................................................. 52
     2.9. Zmienne leksykalne i globalne ................................................................................ 58
     2.10. Podsumowanie .................................................................................................... 60

Rozdział 3. Kroki następne.........................................................................................................................61
     3.1. Podstawowe funkcje wyjścia ................................................................................... 62
     3.2. Czas ..................................................................................................................... 64
     3.3. Podstawowe funkcje wejścia ................................................................................... 65
     3.4. Operacje warunkowe .............................................................................................. 66
     3.5. Operatory porównania ............................................................................................ 70
     3.6. Operatory logiczne ................................................................................................. 72
     3.7. Kolejność wykonywania operacji .............................................................................. 73
     3.8. Pętle..................................................................................................................... 74
6        Perl

         3.9. Sortowanie ............................................................................................................ 79
         3.10. Pliki .................................................................................................................... 81
         3.11. Zmienne wewnętrzne............................................................................................ 85
         3.12. Funkcje przekształcające dane .............................................................................. 87
         3.13. Uruchamianie programów zewnętrznych ................................................................. 92
         3.14. Funkcja fork......................................................................................................... 95
         3.15. Funkcja eval ........................................................................................................ 97
         3.16. Podsumowanie .................................................................................................... 99

    Rozdział 4. Procedury ...............................................................................................................................101
         4.1. Informacje podstawowe ........................................................................................ 102
         4.2. Wartości zwracane ............................................................................................... 102
         4.3. Zmienne w procedurach ....................................................................................... 108
         4.4. Argumenty procedur ............................................................................................. 112
         4.5. Odwołania do procedur......................................................................................... 114
         4.6. Bloki BEGIN i END................................................................................................ 116
         4.7. Sygnały ............................................................................................................... 119
         4.8. Podsumowanie .................................................................................................... 121

    Rozdział 5. Wzorce tekstowe ..................................................................................................................123
         5.1. Czym są wzorce tekstowe? ................................................................................... 124
         5.2. Metaznaki ........................................................................................................... 126
         5.3. Wyszukiwanie zakotwiczone .................................................................................. 129
         5.4. Klasy znaków....................................................................................................... 130
         5.5. Predefiniowane klasy znaków ................................................................................ 131
         5.6. Nawiasy .............................................................................................................. 133
         5.7. Pobieranie części łańcucha................................................................................... 133
         5.8. Podstawianie....................................................................................................... 136
         5.9. Zachłanność........................................................................................................ 137
         5.10. Opcje dopasowywania i podstawiania .................................................................. 137
         5.11. Funkcja study .................................................................................................... 141
         5.12. Obiekty wzorców ................................................................................................ 141
         5.13. Operator tr/// ................................................................................................... 142
         5.14. Zastępowanie tekstów w wielu plikach................................................................. 144
         5.15. Funkcja grep...................................................................................................... 144
         5.16. Podsumowanie .................................................................................................. 145

    Rozdział 6. Moduły ....................................................................................................................................147
         6.1. Pakiety................................................................................................................ 147
         6.2. Moduły................................................................................................................ 152
         6.3. Eksportowanie symboli......................................................................................... 155
         6.4. Kilka przykładowych modułów ............................................................................... 157
         6.5. Dokumentowanie modułów przy użyciu formatu POD ............................................... 161
         6.6. Podsumowanie .................................................................................................... 164

    Rozdział 7. Obiekty....................................................................................................................................165
         7.1. Obiekty ............................................................................................................... 166
         7.2. Metody ............................................................................................................... 167
         7.3. Dziedziczenie....................................................................................................... 170
         7.4. Tworzenie obiektów i praca z nimi ......................................................................... 174
         7.5. Podsumowanie .................................................................................................... 182
Spis treści                7


Rozdział 8. Wiązanie .................................................................................................................................183
     8.1. Wiązanie ............................................................................................................. 184
     8.2. Wiązanie skalarów ............................................................................................... 185
     8.3. Wiązanie tablic asocjacyjnych ............................................................................... 189
     8.4. Wiązanie tablic .................................................................................................... 198
     8.5. Podsumowanie .................................................................................................... 201

Rozdział 9. Praca z plikami .....................................................................................................................203
     9.1. Podstawy pracy z plikami ...................................................................................... 204
     9.2. Sięganie do dowolnego miejsca w pliku ................................................................. 206
     9.3. Uchwyty plików .................................................................................................... 208
     9.4. Korzystanie ze znaków globalnych ......................................................................... 214
     9.5. Identyfikatory rzeczywiste i identyfikatory efektywne ................................................ 215
     9.6. Uprawnienia plikowe ............................................................................................ 217
     9.7. Programy suid i sgid............................................................................................. 219
     9.8. Testowanie plików za pomocą operatorów unarnych................................................ 220
     9.9. Funkcja stat ........................................................................................................ 224
     9.10. Blokowanie plików ............................................................................................. 225
     9.11. Katalogi ............................................................................................................ 227
     9.12. Zmienianie nazw oraz usuwanie plików i katalogów............................................... 230
     9.13. Powiązania ........................................................................................................ 232
     9.14. Podsumowanie .................................................................................................. 233

Rozdział 10. Programy sieciowe i komunikacja między procesami....................................................235
     10.1. Potoki ............................................................................................................... 236
     10.2. Komunikacja poprzez sieć................................................................................... 243
     10.3. Współpraca z protokołami internetowymi ............................................................. 250
     10.4. Podsumowanie .................................................................................................. 261

Rozdział 11. Relacyjne bazy danych ........................................................................................................263
     11.1. Czym właściwie jest relacyjna baza danych?......................................................... 264
     11.2. Wprowadzenie do języka SQL .............................................................................. 265
     11.3. Zapytanie SELECT.............................................................................................. 269
     11.4. Złączenia .......................................................................................................... 274
     11.5. Aktualizowanie i usuwanie rekordów .................................................................... 274
     11.6. Indeksy ............................................................................................................. 275
     11.7. Perl i bazy danych .............................................................................................. 275
     11.8. Proste programy korzystające z DBI ..................................................................... 279
     11.9. Podsumowanie .................................................................................................. 282

Rozdział 12. Tworzenie aplikacji dla baz danych...................................................................................283
     12.1. Projektowanie bazy danych ................................................................................. 283
     12.2. Pisanie aplikacji................................................................................................. 290
     12.3. Usuwanie błędów w programach korzystających z DBI ........................................... 303
     12.4. Podsumowanie .................................................................................................. 306

Rozdział 13. Naprawianie programów i zagadnienia bezpieczeństwa................................................307
     13.1. Identyfikowanie problemów ................................................................................. 308
     13.2. Gdy pojawi się problem ...................................................................................... 312
     13.3. Tryb analizy zagrożeń.......................................................................................... 314
8        Perl

         13.4. Wykrywanie i usuwanie błędów w kodzie .............................................................. 316
         13.5. Szacowanie wydajności kodu .............................................................................. 323
         13.6. Podsumowanie .................................................................................................. 326

    Rozdział 14. Pisanie programów CGI ......................................................................................................327
         14.1. Dynamiczne strony WWW.................................................................................... 327
         14.2. Interfejs CGI ...................................................................................................... 332
         14.3. Komunikaty o błędach i wykrywanie błędów w kodzie programów CGI ..................... 336
         14.4. Przekierowanie do innej strony ............................................................................ 338
         14.5. Inne metody modułu CGI .................................................................................... 341
         14.6. Podsumowanie .................................................................................................. 342

    Rozdział 15. Bardziej zło one programy CGI .........................................................................................343
         15.1. Rejestracja użytkowników ................................................................................... 344
         15.2. Cookies ............................................................................................................ 349
         15.3. Tworzenie grafiki ................................................................................................ 354
         15.4. Szablony ........................................................................................................... 358
         15.5. Podsumowanie .................................................................................................. 361

    Rozdział 16. Aplikacje WWW korzystające z baz danych .....................................................................363
         16.1. Aktualizowanie kursów akcji................................................................................ 364
         16.2. Kartki pocztowe ................................................................................................. 373
         16.3. Personalizacja stron WWW z pomocą bazy danych ................................................ 378
         16.4. Podsumowanie .................................................................................................. 388

    Rozdział 17. mod_perl..............................................................................................................................389
         17.1. Instalowanie i konfiguracja mod_perl ................................................................... 390
         17.2. Dyrektywy konfiguracyjne .................................................................................... 392
         17.3. Trzy proste moduły obsługujące........................................................................... 393
         17.4. Moduł Apache::Registry ...................................................................................... 399
         17.5. Przydatne moduły............................................................................................... 400
         17.6. Podsumowanie .................................................................................................. 406

    Rozdział 18. Mason...................................................................................................................................409
         18.1. Pakiet Mason .................................................................................................... 409
         18.2. Komponenty autohandler i dhandler .................................................................... 417
         18.3. Komponent autohandler ..................................................................................... 417
         18.4. Zarządzanie sesją użytkownika............................................................................ 419
         18.5. Podsumowanie .................................................................................................. 426

    Dodatek A Bibliografia .............................................................................................................................427
         A.1. Książki poświęcone Perlowi .................................................................................. 427
         A.2. Periodyki ............................................................................................................. 429
         A.3. Książki o sieci WWW ............................................................................................ 429
         A.4. Książki o bazach danych....................................................................................... 430
         A.5. Użyteczne witryny WWW ........................................................................................ 431

    Skorowidz ................................................................................................................................................433
Tworzenie aplikacji dla baz danych
   W tym rozdziale:
     n   Projektowanie bazy danych
     n   Tworzenie aplikacji dla baz danych
     n   Wykrywanie błędów w programach &$+

   Poprzedni rozdział był wprowadzeniem do zagadnień związanych z bazami danych, a w szcze-
   gólności do języka SQL i modułu &$+. W tym rozdziale wykorzystamy te narzędzia do przy-
   gotowania zestawu aplikacji obsługujących bazę danych.

   Po drodze przyjrzymy się projektowaniu bazy danych, co — podobnie jak w przypadku
   projektowania programu — jest kluczową, ale często niedocenianą częścią procesu pro-
   gramowania. W szczególności omówimy proces normalizacji, który poprawia efektywność
   bazy danych i czyni ją bardziej elastyczną, redukując jednocześnie mo liwość pojawienia
   się błędów.

   Aplikacje, które stworzymy, będą wykorzystywać zarówno techniki opisane w poprzednim
   rozdziale, jak i nowe typy danych SQL oraz metody interfejsu &$+. Przyjrzymy się bli ej
   metodzie VTCEG, która ułatwia wykrywanie błędów w zapytaniach SQL.

   Rozdział ten dostarcza podstawowej wiedzy na temat procesu pisania programów współ-
   działających z bazą danych, włączając w to projektowanie tabel i wykrywanie błędów w przy-
   gotowanych programach.



12.1. Projektowanie bazy danych
   Nasze zadanie polega na skomputeryzowaniu katalogu ksią ek sprzedawanych w pewnej
   księgarni. Zbudujemy bazę danych księgarni w systemie PostgreSQL i napiszemy w Perlu
   aplikacje, które pozwolą nam na obsługę danych zawartych w bazie.
284   Perl

      Pierwszym krokiem podczas tworzenia aplikacji bazy danych jest zawsze stworzenie tabel.
      Opiszę tutaj proces tworzenia prostego projektu bazy danych, omawiając pokrótce proble-
      my pojawiające się w większości aplikacji baz danych.


12.1.1. Tabela Books
      Poniewa księgarni potrzebny jest katalog ksią ek oferowanych do sprzeda y, trzeba za-
      cząć od przygotowania tabeli $QQMU, której wiersze będą przechowywać dane o poszczegól-
      nych ksią kach (identyfikator ksią ki, kod ISBN, tytuł, autora, wydawcę, liczbę stron, datę
      wydania oraz cenę ksią ki):
        %4'#6' 6#$.' $QQMU
        

           DQQMAKF           5'4+#.         016   07..
           KUDP              6':6           016   07..
           VKVNG             6':6           016   07..
           CWVJQT            6':6           016   07..
           RWDNKUJGT         6':6           016   07..
           PWOARCIGU         07/'4+%
   016   07..
           RWDAFCVG          #6'           016   07..
           WUAFQNNCTARTKEG   07/'4+%
   016   07..

             24+/#4; -';
DQQMAKF
             70+37'
KUDP
        
        

      Nasza tabela $QQMU wygląda podobnie jak tabele, które prezentowałem w rozdziale 11.,
      niemniej pojawia się parę typów danych oraz ograniczeń, których jeszcze nie omawialiśmy:
        n    kolumna daty wydania RWDAFCVG jest typu #6' (data). Jest to typ bardzo podobny
             do typu 6+/'56#/2 (znacznik czasu), ale zawiera samą datę, bez informacji
             o godzinie;
        n    kolumna ceny WUAFQNNCTARTKEG została zdefiniowana jako kolumna typu
             07/'4+%
, co oznacza, e mo e zawierać sześciocyfrowe liczby posiadające
             dwie cyfry po przecinku. Tak więc mo emy sprzedawać ksią ki o cenie do 9999,99
             dolarów;
        n    kolumna KUDP przechowuje niepowtarzalny i niezmienny kod ISBN (ang.
             International Standard Book Number), który mógłby pełnić funkcję klucza głównego.
             Niemniej kody ISBN są dość długie, a zazwyczaj dobrze jest, aby klucz główny
             był tak krótki, jak to tylko mo liwe. Aby upewnić się, e wartości w kolumnie
             KUDP będą niepowtarzalne (choć nie są one kluczem głównym), mo emy dodać
             do definicji tabeli ograniczenie 70+37', które automatycznie utworzy indeks
             dla podanej kolumny.

      Z technicznego punktu widzenia zaprezentowana tutaj definicja tabeli $QQMU jest w pełni
      poprawna. Niemniej w momencie, gdy zaczniemy korzystać z tej tabeli, ujawnią się pewne
      istotne problemy.
Rozdział 12. n Tworzenie aplikacji dla baz danych   285

     Załó my, e księgarnia chciałaby przygotować katalog ksią ek wydawnictwa Prentice-Hall.
     Przedstawione tu zapytanie powinno pobrać nazwy wszystkich ksią ek wydanych przez
     Prentice-Hall:
       5'.'%6 VKVNG
       (41/ $QQMU
       9*'4' RWDNKUJGT  2TGPVKEG*CNN
       14'4 $; VKVNG
       

     Co się jednak stanie, jeśli jedna z ksią ek będzie miała w kolumnie RWDNKUJGT wydawcę
     podanego jako 2TGPVKEG *CNN zamiast 2TGPVKEG*CNN? Taka ksią ka oczywiście nie będzie
     spełniać wymogów stawianych przez nasze zapytanie i w związku z tym nie trafi do katalogu.

     Podobne problemy pojawiają się równie podczas wyszukiwania ksią ek napisanych przez
     określonego autora. Jeśli osoba wpisująca ksią kę do bazy przez pomyłkę źle wpisze na-
     zwisko autora, to ksią ka ta nie pojawi się w odpowiedzi na zapytanie 5'.'%6 pobierające
     autora (CWVJQT) o określonym nazwisku.


12.3.2. Normalizacja tabeli Books
     Rozwiązaniem tego problemu jest normalizacja danych, która pozwala upewnić się, e dane
     wpisywane będą do bazy w jeden tylko sposób. Znormalizowane bazy danych cechuje znacz-
     nie mniejsze ryzyko pojawienia się uszkodzonych lub niezsynchronizowanych danych. Bazy
     takie są równie znacznie wydajniejsze ni bazy, które nie zostały znormalizowane.

     Aby znormalizować tabelę $QQMU, przygotujemy dwie nowe tabele: 2WDNKUJGTU (wydawcy)
     i #WVJQTU (autorzy). Tabele te będą pozwalały na wpisanie ka dego autora i ka dego wy-
     dawcy do bazy danych tylko raz. Dodatkowo wykorzystamy mechanizm kluczy obcych
     wskazujących na te wartości (patrz: sekcja 11.3.6):
       %4'#6' 6#$.' #WVJQTU
       

          CWVJQTAKF    5'4+#.    016 07..
          CWVJQTAPCOG 6':6       016 07..

           24+/#4; -';
CWVJQTAKF
       
       

       %4'#6' 6#$.' 2WDNKUJGTU
       

          RWDNKUJGTAKF 5'4+#.       016 07..
          RWDNKUJGTAPCOG 6':6       016 07..

           24+/#4; -';
RWDNKUJGTAKF
           70+37'
RWDNKUJGTAPCOG
       
       

       %4'#6' 6#$.' $QQMU
       

          DQQMAKF         5'4+#.         016 07..
286   Perl

             KUDP              6':6           016   07..
             VKVNG             6':6           016   07..
             CWVJQTAKF         +06')'4        016   07.. 4'('4'0%'5 #WVJQTU
             RWDNKUJGTAKF      +06')'4        016   07.. 4'('4'0%'5 2WDNKUJGTU
             PWOARCIGU         07/'4+%
   016   07..
             RWDAFCVG          #6'           016   07..
             WUAFQNNCTARTKEG   07/'4+%
   016   07..

             24+/#4; -';
DQQMAKF
             70+37'
KUDP
        
        

      Warto zauwa yć, e tabele te nakładają ograniczenie unikatowości na nazwę wydawnictwa,
      ale nie nakładają go na nazwiska autorów. Mo e się w końcu zdarzyć kilku autorów o na-
      zwisku John Smith, ale raczej nie powinno istnieć więcej ni jedno wydawnictwo o nazwie
      Prentice Hall.

      Znormalizowane tabele gwarantują, e nazwiska autorów i nazwy wydawnictw będą wy-
      stępowały w tej samej formie w całej bazie danych. Co więcej, zmiana nazwy wydawnic-
      twa wymagać będzie teraz aktualizacji tylko jednego wiersza w tabeli 2WDNKUJGTU zamiast
      wielu wierszy w tabeli $QQMU. Jakby tych korzyści było jeszcze mało, tabela $QQMU zmniej-
      szy znacznie swoje rozmiary dzięki zastąpieniu dwóch kolumn typu 6':6 kolumnami typu
      +06')'4. Znormalizowane tabele zajmować będą mniej miejsca na dysku i w pamięci, co
      przyspieszy działanie bazy danych.

      Obecnie nasze zapytanie pobierające ksią ki wydawnictwa Prentice-Hall wymaga wykona-
      nia złączenia:
        5'.'%6 VKVNG
        (41/ $QQMU $ 2WDNKUJGTU 2
        9*'4' 2RWDNKUJGTAPCOG  2TGPVKEG*CNN
          #0 2RWDNKUJGTAKF  $RWDNKUJGTAKF
        14'4 $; VKVNG
        

      Złączenie razem trzech tablic pozwoli na zdobycie listy wszystkich ksią ek napisanych
      przez określonego autora, takiego jak np. Paul Krugman:
        5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG
               $RWDAFCVG $WUAFQNNCTARTKEG
        (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU #
        9*'4' #CWVJQTAPCOG  2CWN -TWIOCP
          #0 $CWVJQTAKF  #CWVJQTAKF
          #0 $RWDNKUJGTAKF  2RWDNKUJGTAKF
        14'4 $; VKVNG
        



12.1.3. Głębsza normalizacja
      Przedstawiona przed chwilą wersja tabeli $QQMU była niewątpliwie krokiem w dobrym kie-
      runku. Co jednak, jeśli dana ksią ka ma więcej ni jednego autora? Dotychczasowa defini-
      cja tabeli nie dopuszcza takiej sytuacji.
Rozdział 12. n Tworzenie aplikacji dla baz danych   287

Jednym z mo liwych rozwiązań tego problemu jest dodanie do tabeli $QQMU kilku nowych
kolumn. Mo na na przykład zmienić kolumnę CWVJQTAKF na CWVJQTAKF i dodać trzy ko-
lumny dopuszczające wartość 07.. (CWVJQTAKF, CWVJQTAKF oraz CWVJQTAKF) przeznaczone
dla dodatkowych autorów.

To rozwiązanie jednak sztucznie ogranicza liczbę autorów, których mo e posiadać ksią ka,
i prowadzi do niepotrzebnego marnotrawienia przestrzeni na dysku w przypadku ka dej
ksią ki, która będzie miała mniej autorów. Dodatkowo nadmiernie komplikuje wszystkie za-
pytania — rozwa my na przykład listę ksią ek napisanych przez Paula Krugmana:
  5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG
         $RWDAFCVG $WUAFQNNCTARTKEG
  (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU #
  9*'4' #CWVJQTAPCOG  2CWN -TWIOCP
    #0 
 $CWVJQTAKF  #CWVJQTAKF
        14 $CWVJQTAKF  #CWVJQTAKF
        14 $CWVJQTAKF  #CWVJQTAKF
        14 $CWVJQTAKF  #CWVJQTAKF 
    #0 $RWDNKUJGTAKF  2RWDNKUJGTAKF
  14'4 $; VKVNG
  

Lepszym rozwiązaniem jest zupełne usunięcie informacji o autorze z tabeli $QQMU. Zamiast
tego przygotujemy tabelę $QQM#WVJQTU (autorzy ksią ki) posiadającą dwie kolumny — jedną
będzie klucz obcy do tabeli $QQMU, a drugą klucz obcy do tabeli #WVJQTU. A oto poprawiona
definicja tabeli $QQMU wraz z tabelą $QQM#WVJQTU:
  %4'#6' 6#$.' $QQMU
  

     DQQMAKF           5'4+#.         016   07..
     KUDP              6':6           016   07..
     VKVNG             6':6           016   07..
     RWDNKUJGTAKF      +06')'4        016   07.. 4'('4'0%'5 2WDNKUJGTU
     PWOARCIGU         07/'4+%
   016   07..
     RWDAFCVG          #6'           016   07..
     WUAFQNNCTARTKEG   07/'4+%
   016   07..

      24+/#4; -';
DQQMAKF
      70+37'
KUDP
  
  

  %4'#6' 6#$.' $QQM#WVJQTU
  

     DQQMAKF +06')'4 016 07.. 4'('4'0%'5 $QQMU
     CWVJQTAKF +06')'4 016 07.. 4'('4'0%'5 #WVJQTU

      70+37'
DQQMAKF CWVJQTAKF
  
  

Zarówno identyfikator ksią ki (DQQMAKF), jak i identyfikator autora (CWVJQTAKF) mogą pojawić
się w tabeli wielokrotnie. Powinniśmy jednak zagwarantować, eby ka dy autor w odniesie-
niu do konkretnej ksią ki pojawiał się tylko raz. Robimy to, stosując ograniczenie 70+37'
łącznie na dwóch kolumnach zamiast na pojedynczej kolumnie.
288   Perl

      Po dodaniu tabeli $QQM#WVJQTU zapytanie odszukujące wszystkie ksią ki napisane przez Paula
      Krugmana wymagać będzie wykonania złączenia czterech tabel:
        5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG
               $RWDAFCVG $WUAFQNNCTARTKEG
        (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU # $QQM#WVJQTU $#
        9*'4' #CWVJQTAPCOG  2CWN -TWIOCP
          #0 #CWVJQTAKF  $#CWVJQTAKF
          #0 $#DQQMAKF  $DQQMAKF
          #0 $RWDNKUJGTAKF  2RWDNKUJGTAKF
        14'4 $; VKVNG
        

      Z kolei następne zapytanie zwraca ksią kę o numerze ISBN , zwracając jeden
      wiersz dla ka dego autora ksią ki:
        5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG
               $RWDAFCVG $WUAFQNNCTARTKEG
        (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU # $QQM#WVJQTU $#
        9*'4' $KUDP  
          #0 $DQQMAKF  $#DQQMAKF
          #0 $#CWVJQTAKF  #CWVJQTAKF
          #0 $RWDNKUJGTAKF  2RWDNKUJGTAKF
        14'4 $; VKVNG
        

      Jak widać, prawidłowo zaprojektowana baza danych pozwala na uzyskanie odpowiedzi na
      wiele ró nych pytań — nawet jeśli nie uwzględnialiśmy ich podczas projektowania bazy.


12.1.4. Indeksy
      Jak pisałem w podrozdziale 11.6, nale y dodawać indeks do ka dej kolumny, która mo e
      pojawiać się w klauzuli 9*'4'. Klucze główne i kolumny oznaczone jako 70+37' są indek-
      sowane automatycznie, co oszczędza nam trochę pracy. W naszych tabelach jest jednak
      jeszcze kilka kolumn, na których prawdopodobnie równie wykonywane będą zapytania.
        %4'#6' +0': CWVJQTAPCOGAKPFGZ 10 #WVJQTU 
CWVJQTAPCOG
        %4'#6' +0': RWDNKUJGTAPCOGAKPFGZ 10 2WDNKUJGTU 
RWDNKUJGTAPCOG

        %4'#6'   +0':   DQQMAVKVNGAKPFGZ 10 $QQMU 
VKVNG
        %4'#6'   +0':   DQQMARWDNKUJGTAKFAKPFGZ 10 $QQMU 
RWDNKUJGTAKF
        %4'#6'   +0':   DQQMARWDFCVGAKPFGZ 10 $QQMU 
RWDAFCVG
        %4'#6'   +0':   DQQMAWUAFQNNCTARTKEGAKPFGZ 10 $QQMU 
WUAFQNNCTARTKEG

        %4'#6' +0': CWVJQTAKFAKPFGZ 10 $QQM#WVJQTU 
CWVJQTAKF

      Przygotowanie tych indeksów sprawi, e nawet jeśli księgarnia oferować będzie kilka mi-
      lionów ksią ek, łatwo i szybko je odnajdziemy, poszukując ksią ek według tytułu, autora,
      daty publikacji czy ceny.
Rozdział 12. n Tworzenie aplikacji dla baz danych   289


12.1.5. Integralność powiązań
     Nasze obecne definicje tabel zabraniają wstawiania wartości 07.. do kolumn tytułów ksią-
      ek i kodów ISBN. Mo e się jednak zdarzyć, e przez przypadek do tej lub innej kolumny
     wstawimy pusty łańcuch.

     Poniewa tworzona baza danych jest centralnym miejscem zbierania informacji o ksią kach
     dostępnych w księgarni, przechowywane w niej dane muszą być na tyle wiarygodne, na ile
     to tylko mo liwe. Słowo kluczowe %*'%- bazy PostgreSQL pozwala na nało enie na ko-
     lumny dodatkowych ograniczeń, w wyniku których wprowadzane dane przechodzić będą
     dodatkowe testy. Na przykład tabelę $QQMU mo na przedefiniować w następujący sposób:
       %4'#6' 6#$.' $QQMU
       

          DQQMAKF           5'4+#.         016   07..
          KUDP              6':6           016   07..    %*'%- 
KUDP     
          VKVNG             6':6           016   07..    %*'%- 
VKVNG `
=#? 
          RWDNKUJGTAKF      +06')'4        016   07..    4'('4'0%'5 2WDNKUJGTU
          PWOARCIGU         07/'4+%
   016   07..    %*'%- 
PWOARCIGU 
          RWDAFCVG          #6'           016   07..
          WUAFQNNCTARTKEG   07/'4+%
   016   07..    %*'%- 
WUAFQNNCTARTKEG   

           24+/#4; -';
DQQMAKF
           70+37'
KUDP
       
       

     Taka poprawiona definicja tabeli $QQMU uniemo liwia wpisanie do kolumny KUDP pustego
     łańcucha, gwarantuje, e kolumna VKVNG zawierać będzie przynajmniej jedną literę lub cyfrę
     (korzystając w tym celu z niewra liwego na rozmiar liter operatora `
PostgreSQL), i wy-
     maga, eby wartości w kolumnach PWOARCIGU i WUAFQNNCTARTKEG były liczbami dodatnimi.

     PostgreSQL będzie od tej pory odmawiać dodawania do bazy ksią ek, które łamać będą
     jedno lub więcej z tak zdefiniowanych ograniczeń. Jeśli na przykład spróbujemy dodać ksią -
     kę nieposiadającą tytułu:
       +05'46 +061 $QQMU
          
KUDP VKVNG RWDNKUJGTAKF PWOARCIGU RWDAFCVG WUAFQNNCTARTKEG
       8#.7'5
          
      GE  
       

     — PostgreSQL zwróci następujący komunikat o błędzie:
       '4414 'ZGE#RRGPF TGLGEV FWG VQ %*'%- EQPUVTCKPV DQQMUAVKVNG

     Tego rodzaju ograniczenia mogą się wydawać nonsensowne lub zbyteczne, niemniej wcale
     tak nie jest. Bez nich moglibyśmy przypadkowo wprowadzić do bazy danych nieprawidłowe
     dane. Naprawianie bazy danych zawierającej niepoprawne lub niespójne dane jest skompli-
     kowanym i pracochłonnym zadaniem, szczególnie jeśli baza danych musi być cały czas do-
     stępna. Ograniczenie %*'%- pozwala na uniknięcie takich sytuacji, wymuszając poprawność
     informacji zapisywanych w bazie danych.
290   Perl


12.1.6. Kategorie ksią ek
      Chcielibyśmy tak e przypisać ka dą ksią kę do jednej lub więcej kategorii. Najprostszy
      sposób polega na przygotowaniu pary tabel podobnych do tych, które przygotowaliśmy dla
      autorów — tabeli %CVGIQTKGU z nazwami kategorii i tabeli %CVGIQT[$QQMU, która powią e te
      kategorie z ksią kami:
        %4'#6' 6#$.' %CVGIQTKGU
        

           ECVGIQT[AKF    5'4+#. 016 07..
           ECVGIQT[APCOG 6':6    016 07..

             24+/#4; -';
ECVGIQT[AKF
             70+37'
ECVGIQT[APCOG
        
        

        %4'#6' 6#$.' $QQM%CVGIQTKGU
        

           DQQMAKF      +06')'4 016 07.. 4'('4'0%'5 2WDNKUJGTU
           ECVGIQT[AKF +06')'4 016 07.. 4'('4'0%'5 %CVGIQTKGU

             70+37'
DQQMAKF ECVGIQT[AKF
        
        

        %4'#6' +0': ECVGIQT[AKFAKPFGZ 10 $QQM%CVGIQTKGU 
ECVGIQT[AKF
        




12.2. Pisanie aplikacji
      Gdy baza danych jest gotowa, mo na przygotować programy Perla, które będą z nią współ-
      pracować. Jeden zestaw programów pozwoli personelowi księgarni wprowadzać, aktuali-
      zować i usuwać informacje na temat ksią ek, autorów i wydawców. Drugi przeznaczony
      będzie dla klientów księgarni, eby z jego pomocą mogli odnaleźć w bazie danych intere-
      sujące ich ksią ki.


12.2.1. Wprowadzanie informacji o autorach
      Kusić nas mo e, aby zacząć od przygotowania aplikacji pozwalającej na wprowadzanie do
      bazy danych informacji o ksią kach. Jednak musimy pamiętać, e kolumna RWDNKUJGTAKF
      w tabeli $QQMU jest kluczem obcym tabeli 2WDNKUJGTU, co oznacza, ze przed zapełnieniem
      tabeli $QQMU trzeba najpierw wypełnić tabelę 2WDNKUJGTU.

      Pierwszy z przedstawionych programów, insert-author.pl, łączy się z serwerem Postgre-
      SQL, pobiera od u ytkownika nazwisko autora ksią ki i wykonuje odpowiednie zapytanie
      +05'46 wstawiające autora do bazy. Jeśli coś pójdzie nie tak, zakończy pracę, sygnalizując
      krytyczny błąd.
Rozdział 12. n Tworzenie aplikacji dla baz danych   291

Program ten wykonuje prosty test integralności danych na poziomie aplikacji, aby upewnić
się, e nazwisko autora zawiera przynajmniej jeden znak. Większość aplikacji współpracu-
jących z bazami danych sprawdza wprowadzane dane dwukrotnie: na poziomie definicji ta-
beli (ograniczenie %*'%-) i ponownie na poziomie aplikacji. Pierwszy test sprawdza, czy baza
danych nie zawiera niespójnych lub uszkodzonych danych, a drugi pozwala na przechwy-
tywanie błędów i przygotowywanie czytelnych komunikatów o błędach dla u ytkownika.
      WUTDKPRGTN
      PCYC RNKMW KPUGTVCWVJQTRN

  WUG UVTKEV
  WUG YCTPKPIU
  WUG $+

    2Q æE UKú  DCæ FCP[EJ
  O[ WUGTPCOG  TGWXGP 
  O[ RCUUYQTF  
  O[ FDJ  $+ EQPPGEV
 $+2IFDPCOGEQTGRGTN  WUGTPCOG RCUUYQTF
                         ] #WVQ%QOOKV   2TKPV'TTQT  _ ^^
      FKG $ æF æEGPKC  DCæ $+GTTUVT 

    2QDKGT QF W [VMQYPKMC PCYKUMQ PQYGIQ CWVQTC
  RTKPV 2QFCL PCYKUMQ CWVQTC 
  O[ CWVJQTAPCOG   
  EJQOR CWVJQTAPCOG

    0CYKUMQ CWVQTC OWUK CYKGTCè RT[PCLOPKGL LGFGP PCM
  KH 
 CWVJQTAPCOG ` Y
  ]
      RTKPV 0CYKUMQ CWVQTC OWUK CYKGTCè 
      RTKPV EQ PCLOPKGL LGFGP PCM -Q Eú RTCEúP 
  _

    ,G NK PCYKUMQ CWVQTC LGUV 1- YUVCY LG
  GNUG
  ]
        7UW PKGRQVTGDPG URCELG  PCYKUMC CWVQTC
       CWVJQTAPCOG ` U@U
I
       CWVJQTAPCOG ` UU
 I

          2T[IQVWL CR[VCPKG
        O[ USN  +05'46 +061 #WVJQTU 
CWVJQTAPCOG 8#.7'5 
! 

        O[ UWEEGUU  FDJ FQ
 USN WPFGH CWVJQTAPCOG


        KH 
 UWEEGUU
        ]
            RTKPV 9UVCYK GO FQ DC[ CWVQTC     CWVJQTAPCOG P 
        _
        GNUG
        ]
            FKG $ æF Y[YQ CPKC CR[VCPKC 53.    USN     $+GTTUVT   
        _

  _

    COMPKL RQ æEGPKG  DCæ FCP[EJ
   FDJ FKUEQPPGEV
292   Perl

      Warto przyjrzeć się odwołaniu do metody FDJ FQ
 w programie insert-author.pl. Metoda
      FQ interfejsu $+ przeznaczona jest dla tych zapytań +05'46 i 72#6', które nie muszą pobie-
      rać wyników zapytania za pośrednictwem uchwytu UVJ. Pierwszy argument metody FDJ
       FQ
 jest łańcuchem zawierającym instrukcję SQL, a drugi odwołaniem do tablicy asocja-
      cyjnej zawierającej definicje atrybutów (lub wartość WPFGH). Pozostałe argumenty są warto-
      ściami, jakie interfejs $+ powinien przypisać symbolom zastępczym w instrukcji SQL.
      Metoda FDJ FQ
 zwraca liczbę zmienionych przez nią wierszy w tabeli.


12.2.2. Wprowadzanie kategorii
      Program insert-category.pl wstawiający nową kategorię do tabeli %CVGIQTKGU jest bardzo
      podobny do programu insert-author.pl. Niemniej tym razem istnieje pewna pułapka: ko-
      lumna ECVGIQT[APCOG została zdefiniowana jako 70+37'. Nasza aplikacja mogłaby ignoro-
      wać ten wymóg, próbując na ślepo wstawiać nowe nazwy kategorii do tabeli %CVGIQTKGU.
      Gdyby baza PostgreSQL odmówiła dodania nowej kategorii, moglibyśmy przechwycić
      błąd i zaraportować go u ytkownikowi.

      Tutaj jednak zastosowaliśmy bardziej wyszukane rozwiązanie, które wymaga sprawdzenia
      bazy danych w celu ustalenia, czy taka nazwa kategorii nie została ju wcześniej wprowa-
      dzona. To jednak pociąga za sobą konieczność wykonania zapytania 5'.'%6 (aby pobrać
      nazwy ju istniejących kategorii), a dopiero potem zapytania +05'46 (aby wstawić nową kate-
      gorię). Co jednak, jeśli ktoś inny spróbuje wykonać między tymi dwoma zapytaniami po-
      dobne zapytanie +05'46?

      Rozwiązanie, tak jak to zostało wspomniane w sekcji 11.7.4 w poprzednim rozdziale, pole-
      ga na połączeniu zapytań 5'.'%6 i +05'46 w pojedynczej transakcji. W ten sposób upew-
      niamy się, e nikt inny nie zmodyfikuje bazy danych między obydwoma naszymi zapyta-
      niami. Obsługę transakcji mo na włączyć, przypisując atrybutowi #WVQ%QOOKV wartość (#.5'.
      Wygodniej jest jednak skorzystać z metody FDJ DGIKPAYQTM
, która wyłączy atrybut #W
      VQ%QOOKV na czas pojedynczej transakcji — do momentu wywołania metody FDJ EQOOKV

      zatwierdzającej transakcję lub metody FDJ TQNNDCEM
 wycofującej transakcję.

      Kod programu będzie więc najpierw pytał u ytkownika o nazwę nowej kategorii, następnie
      za pomocą zapytania 5'.'%6 sprawdzi, czy takiej nazwy ju nie ma, a jeśli taka kategoria ju
      istnieje — przerwie wykonywanie transakcji, przywołując metodę FDJ TQNNDCEM
. Wy-
      cofanie transakcji nie jest w tym przypadku tak naprawdę konieczne, poniewa nie zmody-
      fikowaliśmy adnej tabeli. Ja jednak zawsze staram się postępować przezornie i przerywam
      zapytanie za pomocą metody FDJ TQNNDCEM
. Gdy ju dane przejdą wszystkie testy na
      poziomie aplikacji, wykonywane jest zapytanie +05'46 i wywoływana metoda FDJ EQOOKV

      zatwierdzająca transakcję.

      Warto zauwa yć, e program insert-category.pl działa z włączonym atrybutem 4CKUG'TTQT.
      Oznacza to, e nie ma potrzeby sprawdzania wartości zwracanych przez procedury RTGRCTG
      i GZGEWVG, poniewa program zakończy działanie, sygnalizując krytyczny błąd, za ka dym
      razem, gdy natknie się na błąd bazy danych.
             WUTDKPRGTN
             PCYC RNKMW KPUGTVECVGIQT[RN
Rozdział 12. n Tworzenie aplikacji dla baz danych   293

WUG UVTKEV
WUG YCTPKPIU
WUG $+

  2Q æE UKú  DCæ FCP[EJ
O[ WUGTPCOG  TGWXGP 
O[ RCUUYQTF  
O[ FDJ  $+ EQPPGEV
 $+2IFDPCOGEQTGRGTN  WUGTPCOG RCUUYQTF
                       ] #WVQ%QOOKV   4CKUG'TTQT  _ ^^
    FKG $ æF æEGPKC  DCæ $+GTTUVT 

  2QDKGT QF W [VMQYPKMC PCYú PQYGL MCVGIQTKK
RTKPV 2QFCL PCYú PQYGL MCVGIQTKK 
O[ ECVGIQT[APCOG   
EJQOR ECVGIQT[APCOG

  0CYC MCVGIQTKK OWUK CYKGTCè RT[PCLOPKGL LGFGP PCM
KH 
 ECVGIQT[APCOG ` Y
]
    RTKPV 0CYC MCVGIQTKK OWUK CYKGTCè 
    RTKPV EQ PCLOPKGL LGFGP PCM 'ZKVKPIP 
_

  ,G NK PCYC MCVGIQTKK LGUV 1- URTÎDWL Læ YUVCYKè
GNUG
]
      7UW PKGRQVTGDPG URCELG
     ECVGIQT[APCOG ` U@U
I
     ECVGIQT[APCOG ` UU
 I

     9[ æE #WVQ%QOOKV PC ECU LGFPGL VTCPUCMELK 2QQUVCPKG QP Y[ æEQP[
     FQ ECUW Y[YQ CPKC OGVQF[ FDJ EQOOKV
 NWD FDJ TQNNDCEM


     FDJ DGIKPAYQTM


     
     %[ VCMC PCYC MCVGIQTKK LW LGUV Y DCKG FCP[EJ!
     ,G NK VCM Y[EQHCL VTCPUCMELú RQKPHQTOWL W [VMQYPKMC Q RTQDNGOKG
     K CMQ E RTCEú

      7VYÎT CR[VCPKG
    O[ UGNGEVAUSN  5'.'%6 %1706
ECVGIQT[AKF 
     UGNGEVAUSN  (41/ %CVGIQTKGU YJGTG ECVGIQT[APCOG  ! 

      2T[IQVWL KPUVTWMELú
    O[ UVJ  FDJ RTGRCTG
 UGNGEVAUSN

     9[MQPCL KPUVTWMELú
    UVJ GZGEWVG
 ECVGIQT[APCOG

      2QDKGT Y[PKM
    O[ 
 ECVGIQT[ACNTGCF[AGZKUVU  UVJ HGVEJTQYACTTC[

      CMQ E VQ CR[VCPKG
     UVJ HKPKUJ

   KH 
 ECVGIQT[ACNTGCF[AGZKUVU
294   Perl

             ]
                 RTKPV -CVGIQTKC ECVGIQT[APCOG D[ C LW 
                 RTKPV FQFCPC FQ DC[P5RTÎDWL YRKUCè KPPæ PCYúP 

                     6TCPUCMELC Y[EQHCPC
                    FDJ TQNNDCEM

             _

             GNUG
             ]
                   2T[IQVWL CR[VCPKG +05'46
                 O[ USN  +05'46 +061 %CVGIQTKGU 
ECVGIQT[APCOG 8#.7'5 
! 

                   2T[IQVWL KPUVTWMELú
                 O[ UWEEGUUHWNN[AKPUGTVGF  FDJ FQ
 USN WPFGH ECVGIQT[APCOG

                 KH 
 UWEEGUUHWNN[AKPUGTVGF
                 ]
                     RTKPV QFC GO FQ DC[ MCVGIQTKú ECVGIQT[APCOG P 
                      FDJ EQOOKV

                 _
                 GNUG
                 ]
                     RTKPV $ æF YUVCYKCPKC $+GTTUVT P 
                      FDJ TQNNDCEM

                 _
             _
        _

          CMQ E RQ æEGPKG  DCæ FCP[EJ
         FDJ FKUEQPPGEV

      Jak łatwo przewidzieć, program insert-publisher.pl będzie wyglądał bardzo podobnie do
      programu insert-category.pl.


12.2.3. Modyfikowanie ju istniejących wartości
      Program insert-category.pl działa całkiem sprawnie — co jednak, jeśli ktoś wprowadzi do
      bazy złą nazwę kategorii? Baza danych księgarni potrzebuje jakiegoś sposobu modyfiko-
      wania ju istniejących nazw kategorii (to samo dotyczy wstawionych nazw autorów i wy-
      dawców, ale tutaj omawiać będziemy tylko przypadek kategorii).

      Program update-category.pl będzie wymagał podania przez u ytkownika dwóch wartości:
      starej nazwy kategorii QNFAECVGIQT[APCOG i nowej kategorii PGYAECVGIQT[APCOG. Mo e się
      jednak zdarzyć, e u ytkownik popełni błąd przy wpisywaniu starej nazwy kategorii, po-
      dając nazwę, której nie ma w bazie danych, i wówczas klauzula 9*'4' zapytania SQL nie
      będzie pasowała do adnego wiersza tabeli %CVGIQTKGU.

      Moduł 6GTO%QORNGVG dostępny w sieci %2#0 (patrz: podrozdział 1.6) pozwala na ograni-
      czenie liczby przyjmowanych od u ytkownika danych wejściowych. Moduł 6GTO%QORNGVG
      automatycznie eksportuje do przestrzeni nazw kodu przywołującego procedurę %QORNGVG.
Rozdział 12. n Tworzenie aplikacji dla baz danych   295

Procedura %QORNGVG wymaga przesłania jej dwóch argumentów. Pierwszy z nich to tekst
komunikatu proszącego o wprowadzenie danych, który zostanie wyświetlony u ytkowni-
kowi, a drugi jest listą lub te odwołaniem do tablicy, które zawierać będą dopuszczalne
odpowiedzi u ytkownika. U ytkownik mo e w ka dej chwili wcisnąć klawisze CTL+D, by
wyświetlić listę dopuszczalnych odpowiedzi. Jeśli u ytkownik wprowadzi wystarczającą
liczbę znaków, aby było mo liwe jednoznaczne zidentyfikowanie danego elementu listy,
wciśnięcie klawisza TAB pozwoli uzupełnić resztę.

Program update-category.pl pobierze listę bie ących kategorii (która przesłana zostanie
procedurze %QORNGVG), korzystając z zapytania 5'.'%6, a następnie będzie modyfikować bazę
za pomocą zapytania 72#6'. Oba zapytania zostaną połączone w jedną transakcję za po-
mocą metody FDJ DGIKPAYQTM, podobnie jak to było w programie insert-category.pl.

Lista kategorii pobierana jest z tabeli %CVGIQTKGU. Zamiast jednak umieszczać nazwy kate-
gorii w tablicy, uczynimy je kluczami tablicy asocjacyjnej ECVGIQTKGU. Sprawdzenie, czy
dany klucz istnieje w tablicy asocjacyjnej, zajmuje bowiem znacznie mniej czasu ni od-
szukanie elementu w tablicy, tak więc program będzie dzięki temu działał szybciej.

A oto jedna z mo liwych implementacji programu update-category.pl:
    WUTDKPRGTN
    PCYC RNKMW WRFCVGECVGIQT[RN

  WUG   UVTKEV
  WUG   YCTPKPIU
  WUG   $+
  WUG   6GTO%QORNGVG

    2Q æE UKú  DCæ FCP[EJ
  O[ WUGTPCOG  TGWXGP 
  O[ RCUUYQTF  
  O[ FDJ  $+ EQPPGEV
 $+2IFDPCOGEQTGRGTN  WUGTPCOG RCUUYQTF
                         ] #WVQ%QOOKV   4CKUG'TTQT  _ ^^
      FKG $ æF æEGPKC  DCæ $+GTTUVT 

  O[ ECVGIQTKGU  


    
    4QRQEPKL VTCPUCMELú MVÎTC DúFKG VTYC C FQ ECUW
    Y[YQ CPKC OGVQF[ FDJ EQOOKV
 NWD FDJ TQNNDCEM

   FDJ DGIKPAYQTM


    2QDKGT PCY[ MCVGIQTKK K WE[ LG MNWECOK ECVGIQTKGU
  O[ USN  5'.'%6 ECVGIQT[APCOG HTQO %CVGIQTKGU 
  O[ UVJ  FDJ RTGRCTG
 USN
   UVJ GZGEWVG

  YJKNG 
O[ TQYTGH  UVJ HGVEJTQYACTTC[TGH
  ]
        QFCL PQY[ MNWE FQ ECVGIQTKGU  YCTVQ EKæ 
       ECVGIQTKGU] TQYTGH=?_  
  _

    CMQ E KPUVTWMELú
   UVJ HKPKUJ
296   Perl

        O[ QNFAECVGIQT[APCOG       

          2QDKGT KUVPKGLæEæ MCVGIQTKú W [YCLæE 6GTO%QORNGVG )F[ RTGTYKGO[
          Vú RúVNú OKGPPC QNFAECVGIQT[APCOG DúFKG CYKGTCè PCYú
          KUVPKGLæEGL MCVGIQTKK
        WPVKN 
FGHKPGF ECVGIQTKGU] QNFAECVGIQT[APCOG_
        ]
             QNFAECVGIQT[APCOG 
                %QORNGVG
 9RTQYCF PCYú KUVPKGLæEGL MCVGIQTKK  MG[U ECVGIQTKGU
        _

             
             2QDKGT PQYæ PCYú MCVGIQTKK

        RTKPV OKG    QNFAECVGIQT[APCOG PC 
        O[ PGYAECVGIQT[APCOG   
        EJQOR PGYAECVGIQT[APCOG

          0CYC MCVGIQTKK OWUK CYKGTCè RT[PCLOPKGL LGFGP PCM
        KH 
 PGYAECVGIQT[APCOG ` Y
        ]
            RTKPV $ æF 0CYC MCVGIQTKK OWUK CYKGTCè EQ PCLOPKGL LGFGP PCM P 
        _

          ,G NK PCY[ MCVGIQTKK Uæ 1- URTCYF  E[ PKG OC LW LGL
          Y DCKG FCP[EJ
        GNUG
        ]
              7UW  PCY[ PKGRQVTGDPG URCELG
             PGYAECVGIQT[APCOG ` U@U
I
             PGYAECVGIQT[APCOG ` UU
 I

                ,G NK PGYAECVGIQT[APCOG LGUV Y VCDGNK ECVGIQTKGU OWUKO[
                RTGTYCè CD[ PCY[ UKú PKG RQYVCTC [
              KH 
FGHKPGF ECVGIQTKGU] PGYAECVGIQT[APCOG_
              ]
                    CU[IPCNKWL D æF W [VMQYPKMQYK K Y[EQHCL VTCPUCMELú
                  RTKPV $ æF -CVGIQTKC PGYAECVGIQT[APCOG LW KUVPKGLG Y DCKG FCP[EJ P 
                   FDJ TQNNDCEM

                   FDJ FKUEQPPGEV

                  GZKV
              _

                7VYÎT CR[VCPKG
              O[ USN  72#6' %CVGIQTKGU 
               USN  5'6 ECVGIQT[APCOG  ! 
               USN  9*'4' ECVGIQT[APCOG  ! 

                2T[IQVWL KPUVTWMELú
              O[ PWODGTAQHACHHGEVGFATQYU 
                   FDJ FQ
 USN WPFGH PGYAECVGIQT[APCOG QNFAECVGIQT[APCOG

              KH 
 PWODGTAQHACHHGEVGFATQYU  
              ]
                    4CRQTVWL Y[PKM W [VMQYPKMQYK K CVYKGTF VTCPUCMELú
                  RTKPV OKGPK GO PCYú QNFAECVGIQT[APCOG PC PGYAECVGIQT[APCOG P 
                   FDJ EQOOKV

              _
Rozdział 12. n Tworzenie aplikacji dla baz danych   297

            GNUG
            ]
                  4CRQTVWL D æF W [VMQYPKMQYK K Y[EQHCL VTCPUCMELú
                RTKPV OKCPC PCY[ PKG QUVC C Y[MQPCPCP 
                 FDJ TQNNDCEM

            _
      _

        CMQ E RQ æEGPKG  DCæ FCP[EJ
       FDJ FKUEQPPGEV




12.2.4. Dodawanie nowych ksią ek
    Po dodaniu kilku pozycji do tabel #WVJQTU, 2WDNKUJGTU i %CVGIQTKGU mo na przystąpić do
    wprowadzania do bazy danych księgarni nowych ksią ek. Dodanie nowej ksią ki oznacza
    konieczność wstawienia jednego wiersza do tabeli $QQMU i jednego lub więcej wierszy do
    tabeli $QQM#WVJQTU.

    Kolejny program, insert-book.pl, wykorzystuje większość technik, które opisywałem wcze-
    śniej w tym rozdziale: wykonuje zapytanie pobierające z bazy danych listę ju wprowadzo-
    nych wydawców i autorów, wykorzystuje moduł 6GTO%QORNGVG, dzięki któremu u ytkownik
    podaje odpowiednią nazwę wydawnictwa i nazwisko autora, i wreszcie wstawia wiersze do
    tabel $QQMU i $QQM#WVJQTU. Co więcej, przeprowadza to wszystko w ramach jednej transak-
    cji, dzięki czemu opisana sekwencja transakcji zostaje wykonana łącznie i niepowodzenie
    jednej oznaczać będzie niepowodzenie wszystkich.

    Warto równie zauwa yć, e korzystamy tutaj z właściwego tylko bazie PostgreSQL atry-
    butu RIAQKFAUVCVWU, który zwraca identyfikator (OID) ostatnio wstawionego obiektu.

    Identyfikatory obiektów są elementem specyficznym dla PostgreSQL. Mo na postrzegać je
    jako niewidoczny, globalny klucz główny ka dego wiersza w bazie danych. Identyfikator
    OID ostatnio wprowadzonego wiersza pozwala na pobranie klucza głównego dla ostatnio
    wykonanej operacji +05'46.

    Na koniec warto przyjrzeć się, w jaki sposób wiersze wstawiane są do tabeli $QQM#WVJQTU
    za pomocą pojedynczego odwołania do metody RTGRCTG i kilkakrotnego przywoływania
    metody GZGEWVG. W ten sposób odcią amy program Perla i przyśpieszamy znacznie wyko-
    nywanie zapytania, jeśli baza, z której korzystamy, przechowuje zapytania w pamięci pod-
    ręcznej.

    Program insert-book.pl jest jak dotąd najdłu szym programem związanym z bazami da-
    nych, które były omawiane w tej ksią ce. Poniewa jednak wszystkie jego elementy poja-
    wiały się ju w poprzednio prezentowanych programach, zrozumienie go nie powinno być
    zbyt trudne.
          WUTDKPRGTN
          PCYC RNKMW KPUGTVDQQMRN

      WUG UVTKEV
      WUG YCTPKPIU
      WUG $+
298   Perl

        WUG 6GTO%QORNGVG

        RTKPV 9KVCO[ Y RTQITCOKG 9UVCY MUKæ Mú PP 

          2Q æE UKú  DCæ FCP[EJ
        O[ WUGTPCOG  TGWXGP 
        O[ RCUUYQTF  
        O[ FDJ  $+ EQPPGEV
 $+2IFDPCOGEQTGRGTN  WUGTPCOG RCUUYQTF
                               ]
                                 #WVQ%QOOKV   4CKUG'TTQT  _ ^^
            FKG $ æF æEGPKC  DCæ $+GTTUVT 

          FGHKPKWL RCTú EúUVQ W [YCP[EJ OKGPP[EJ
        O[ 
 USN UVJ

          
          CEPKL PQYæ VTCPUCMELú MVÎTæ CMQ E[ Y[YQ CPKG FDJ EQOOKV

          NWD FDJ TQNNDCEM

         FDJ DGIKPAYQTM


          
          2QDKGT CWVQTÎY K WE[ KEJ MNWECOK VCDNKE[ CUQELCE[LPGL
        O[ CWVJQTU  


         USN  5'.'%6 CWVJQTAPCOG CWVJQTAKF 
         USN  (41/ #WVJQTU 

          2T[IQVWL KPUVTWMELú
         UVJ  FDJ RTGRCTG
 USN

          9[MQPCL KPUVTWMELú
         UVJ GZGEWVG

        YJKNG 
O[ TQYTGH  UVJ HGVEJTQYACTTC[TGH
        ]
            O[ 
 CWVJQTAPCOG CWVJQTAKF  ] TQYTGH_
             CWVJQTU] CWVJQTAPCOG_  CWVJQTAKF
        _

          
          2QDKGT Y[FCYEÎY K WE[ KEJ MNWECOK VCDNKE[ CUQELCE[LPGL
        O[ RWDNKUJGTU  


         USN  5'.'%6 RWDNKUJGTAPCOG RWDNKUJGTAKF 
         USN  (41/ 2WDNKUJGTU 

          2T[IQVWL KPUVTWMELú
         UVJ  FDJ RTGRCTG
 USN

          9[MQPCL KPUVTWMELú
         UVJ GZGEWVG

        YJKNG 
O[ TQYTGH  UVJ HGVEJTQYACTTC[TGH
        ]
            O[ 
 RWDNKUJGTAPCOG RWDNKUJGTAKF  ] TQYTGH_
             RWDNKUJGTU] RWDNKUJGTAPCOG_  RWDNKUJGTAKF
        _
Rozdział 12. n Tworzenie aplikacji dla baz danych   299

  
  2QDKGT KPHQTOCELú QF W [VMQYPKMC
O[ KUDP  IGVAKPHQ
 +5$0 
O[ VKVNG  IGVAKPHQ
 V[VW 

  2QDKGT YKGNW CWVQTÎY
O[ CWVJQTU
YJKNG 
O[ CWVJQT  IGVAKPHQ
 CWVQTC  MG[U CWVJQTU
]
    NCUV WPNGUU CWVJQT
    RWUJ CWVJQTU CWVJQT
_

O[   RWDNKUJGT  IGVAKPHQ
 Y[FCYEú  MG[U RWDNKUJGTU
O[   RCIGU  IGVAKPHQ
 NKEDú UVTQP 
O[   RWDAFCVG  IGVAKPHQ
 FCVú Y[FCPKC 
;;;;// 
O[   WUAFQNNCTARTKEG  IGVAKPHQ
 EGPú Y FQNCTCEJ 

 
 9UVCY FQ DC[ PQYæ MUKæ Mú
USN  +05'46 +061 $QQMU 
USN  
KUDP VKVNG RWDNKUJGTAKF PWOARCIGU 
USN     RWDAFCVG WUAFQNNCTARTKEG 
USN  8#.7'5 
! ! ! ! ! ! 

UVJ  FDJ RTGRCTG
 USN

UVJ GZGEWVG
 KUDP VKVNG RWDNKUJGTU] RWDNKUJGT_ RCIGU
              RWDAFCVG WUAFQNNCTARTKEG

O[ PGYADQQMAQKF  UVJ ]RIAQKFAUVCVWU_

UVJ HKPKUJ


  
  7 [L KFGPV[HKMCVQTC 1+ PQYGL MUKæ MK FQ RQDTCPKC DQQMAKF

USN  5'.'%6 DQQMAKF 
USN  (41/ $QQMU 
USN  9*'4' QKF  ! 

 2T[IQVWL KPUVTWMELú
UVJ  FDJ RTGRCTG
 USN

  9[MQPCL KPUVTWMELú
 UVJ GZGEWVG
 PGYADQQMAQKF

  2QDKGT DQQMAKF  YKGTUC Q KFGPV[HKMCVQTG 1+
O[ 
 PGYADQQMAKF  UVJ HGVEJTQYACTTC[

UVJ HKPKUJ


  
  9UVCY RQYKæCPKG MUKæ MK  CWVQTGO
 USN  +05'46 +061 $QQM#WVJQTU 
DQQMAKF CWVJQTAKF 8#.7'5 
! ! 

UVJ  FDJ RTGRCTG
 USN
300   Perl

        HQTGCEJ O[ CWVJQT 
CWVJQTU
        ]
             UVJ GZGEWVG
 PGYADQQMAKF CWVJQTU] CWVJQT_
            RTKPV )QVQYGP 
        _

          +PUVTWMELC CMQ EQPC
         UVJ HKPKUJ


          ,G NK YU[UVMQ RQU Q FQDTG CVYKGTFCO[ VTCPUCMELú
         FDJ EQOOKV


          CO[MCO[ RQ æEGPKG  DCæ FCP[EJ
         FDJ FKUEQPPGEV


          
          2TQEGFWTC RQDKGTCLæEC KPHQTOCELG QF W [VMQYPKMC
        UWD IGVAKPHQ
        ]
            O[ SWGUVKQP  UJKHV
            O[ EQORNGVKQPU  A
            O[ EQORNGVKQPUAJCUJ  OCR ]
 A _ EQORNGVKQPU

             O[ KPRWV    

               7 [YCO[ 6GTO%QORNGVG LG NK VTGDC WWRG PKè FCPG
             KH 
EQORNGVKQPU
             ]
                  KPRWV 
                     %QORNGVG
 2QFCL SWGUVKQP MUKæ MK  MG[U EQORNGVKQPUAJCUJ
             _

               ,G NK PKG OC VCMKGL RQVTGD[ TQRQE[PCO[ UVCPFCTFQYQ
             GNUG
             ]
                 RTKPV 2QFCL SWGUVKQP MUKæ MK 
                  KPRWV                 2QDKGT FCPG QF W [VMQYPKMC
                 EJQOR KPRWV              7UW  MQ EC PCM PQYGIQ YKGTUC

                 KPRWV ` U@U
I      7UW URCELG  RQEæVMW
                 KPRWV ` UU
 I      7UW URCELG  MQ EC
             _

             TGVWTP KPRWV
        _

      Mimo i program insert-book.pl nie obsługuje kategorii, nietrudno domyślić się, jak powi-
      nien wyglądać odpowiedni kod, który nale ałoby w tym celu dodać do programu.


12.2.5. Pobieranie informacji o ksią kach
      Teraz, gdy baza danych księgarni jest gotowa, pora przygotować prostą aplikację wykonu-
      jącą zapytania, które umo liwią u ytkownikom zdobycie informacji na temat konkretnych
      ksią ek. Napiszemy przykładowy program, który będzie zwracał ksią ki o tytułach zawie-
      rających tekst wprowadzony przez u ytkownika.
Rozdział 12. n Tworzenie aplikacji dla baz danych   301

Warto zauwa yć, e najpierw wczytujemy wszystkie informacje o ksią ce do tablicy aso-
cjacyjnej DQQM, a dopiero później je wyświetlamy. Dzieje się tak, poniewa baza Postgre-
SQL zwróci po jednym wierszu dla ka dego autora ksią ki. Gdybyśmy po prostu wyświe-
tlili wyniki, tak jak są one zwracane przez bazę danych, ksią ki mające dwóch autorów
byłyby wyświetlane dwukrotnie, a ksią ki mające pięciu autorów — a pięć razy! Unik-
niemy takich powtórzeń, wczytując wszystkie zwrócone ksią ki do tablicy asocjacyjnej ta-
blic asocjacyjnych, którą następnie posortujemy i wyświetlimy to, co nam pozostanie.

Porządek, w jakim będą zwracane wyniki, mo e wydawać się nieistotny, skoro i tak zostaną
one uporządkowane w pętli HQTGCEJ. Nie jest to jednak do końca prawda: autorzy są doda-
wani do tablicy asocjacyjnej DQQM w takim samym porządku, w jakim są pobierani. Dlatego
właśnie klauzula 14'4 $; upewnia się, e zwracane wiersze będą uporządkowane według
nazwisk autorów.

Aby uniknąć pomyłek, które mogą być spowodowane ró nicami w wielkości liter, wyko-
rzystywana jest funkcja .19'4 języka SQL, która powoduje zamianę wszystkich wielkich
znaków ciągów, które są jej argumentami, na małe:
    WUTDKPRGTN
    PCYC RNKMW SWGT[VKVNGRN

  WUG UVTKEV
  WUG YCTPKPIU
  WUG $+

  RTKPV SS]9KVCO[ Y RTQITCOKG CR[VCPKC PP_

    2Q æE UKú  DCæ FCP[EJ
  O[ WUGTPCOG  TGWXGP 
  O[ RCUUYQTF  
  O[ FDJ  $+ EQPPGEV
 $+2IFDPCOGEQTGRGTN  WUGTPCOG RCUUYQTF
                         ] #WVQ%QOOKV   4CKUG'TTQT  _ ^^
      FKG $ æF æEGPKC  DCæ $+GTTUVT 

    2QDKGT V[VW QF W [VMQYPKMC
  RTKPV 2QFCL RQUWMKYCP[ PCRKU 
  O[ VCTIGV   
  EJQOR VCTIGV

    9G Y EWF[U ÎY OGVCPCMK 53.
   VCTIGV ` U^ ^ ^I
   VCTIGV ` U^A^A^I

    2TGMUVC è C EWEJ Y Y[TC GPKG TGIWNCTPG 53.
   VCTIGV     VCTIGV 

    7VYÎT CR[VCPKG
  O[ USN  5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG $PWOARCIGU 
   USN         $RWDAFCVG $WUAFQNNCTARTKEG #CWVJQTAPCOG 
   USN  (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU # $QQM#WVJQTU $# 
   USN  9*'4' .19'4
$VKVNG .+-' .19'4
! 
   USN     #0 $#CWVJQTAKF  #CWVJQTAKF 
   USN     #0 $DQQMAKF  $#DQQMAKF 
   USN     #0 $RWDNKUJGTAKF  2RWDNKUJGTAKF 
   USN  14'4 $; #CWVJQTAPCOG
302   Perl

          2T[IQVWL KPUVTWMELú
        O[ UVJ  FDJ RTGRCTG
 USN

          9[MQPCL KPUVTWMELú
        O[ UWEEGUU  UVJ GZGEWVG
 VCTIGV

        KH 
 UWEEGUU
        ]
            O[ DQQM  


             YJKNG 
O[ TQYTGH  UVJ HGVEJTQYACTTC[TGH
             ]
                 O[ 
 KUDP VKVNG RWDNKUJGT RCIGU
                      FCVG RTKEG CWVJQT   TQYTGH

                  CEJQYCL KPHQTOCELú Q MUKæ EG Y DQQM
                 DQQM] KUDP_ ]VKVNG_  VKVNG
                 DQQM] KUDP_ ]RWDNKUJGT_  RWDNKUJGT
                 DQQM] KUDP_ ]RCIGU_  RCIGU
                 DQQM] KUDP_ ]FCVG_  FCVG
                 DQQM] KUDP_ ]RTKEG_  RTKEG

                   CLOKL UKú CWVQTCOK
                 KH 
 DQQM] KUDP_ ]CWVJQT_
                 ]
                      DQQM] KUDP_ ]CWVJQT_   CWVJQT 
                 _
                 GNUG
                 ]
                      DQQM] KUDP_ ]CWVJQT_  CWVJQT 
                 _
             _

               2TGLT[L MUKæ MK Y RúVNK K Y[ YKGVN KPHQTOCELG Q PKEJ
             HQTGCEJ O[ KUDP
                 
UQTV ] DQQM] C_ ]VKVNG_ EOR DQQM] D_ ]VKVNG__ MG[U DQQM
                 ]
                     RTKPV P 
                     RTKPV DQQM] KUDP_ ]VKVNG_P 
                     RTKPV  Z NGPIVJ
 DQQM] KUDP_ ]VKVNG_ P 

                     RTKPV    #WVQT DQQM] KUDP_ ]CWVJQT_P 
                     RTKPV    +5$0 KUDPV9[FCYEC DQQM] KUDP_ ]RWDNKUJGT_P 
                     RTKPV    CVC Y[FCPKC DQQM] KUDP_ ]FCVG_V 
                     RTKPV    %GPC  DQQM] KUDP_ ]RTKEG_P 
                     RTKPV    .KEDC UVTQP DQQM] KUDP_ ]RCIGU_P 
                 _

             KH 
 UVJ TQYU  
             ]
                 RTKPV $TCM MUKæ GM RCUWLæE[EJ FQ YQTECP 
             _

        _
        GNUG
        ]
            RTKPV $ æF RT[IQVQYCPKC CR[VCPKC $+GTTUVT 
        _

         UVJ HKPKUJ

         FDJ FKUEQPPGEV
Rozdział 12. n Tworzenie aplikacji dla baz danych   303



12.3. Usuwanie błędów
w programach korzystających z DBI
   Perl jest językiem programowania, w którym błędy wykrywa się bardzo łatwo. Wielu pro-
   gramistów zamiast korzystać z wbudowanego debuggera (patrz: sekcja 13.4.2), po prostu
   wstawia do kodu kilka instrukcji RTKPV. Tego rodzaju techniki nie zawsze jednak wystar-
   czają, gdy korzystamy z interfejsu $+.

   Jeśli na przykład program zakończy pracę w wyniku błędu bazy danych po próbie wykona-
   nia instrukcji +05'46 wstawiającej wiersz do bazy danych $QQM#WVJQTU, dobrze by było wie-
   dzieć, jak dokładnie wyglądało ostateczne zapytanie SQL, zanim zostało wysłane do bazy
   danych. Jeśli korzystamy w zapytaniu z symboli zastępczych, oka e się, e uzyskanie tego
   rodzaju informacji jest bardzo trudne.

   Rozwiązaniem jest metoda FDJ VTCEG
, która pomaga w usuwaniu błędów z programów
   korzystających z interfejsu $+. Wymaga ona jednego obowiązkowego argumentu, który
   powinien być liczbą całkowitą z przedziału od 0 (zupełny brak wykrywania błędów) do 9
   (poziom wykrywania błędów oferujący znacznie więcej informacji ni prawdopodobnie
   kiedykolwiek będziesz potrzebować). Drugi argument jest opcjonalny i podaje nazwę pliku
   na dysku, do którego mają być zapisywane informacje debugowania. Domyślnie wszystkie
   informacje dostarczane przez metodę FDJ VTCEG
 trafiają do standardowego strumienia
   błędów 56'44.

   Po aktywacji metoda FDJ VTCEG
 działać będzie przez cały czas pracy programu lub do
   momentu, gdy zostanie wyłączona. Bardzo często metodę FDJVTCEG
 wykorzystuje się
   w trakcie tworzenia programu, by wyłączyć ją, kiedy program zaczyna normalne działanie.

   Mo na równie wywołać metodę VTCEG jako metodę klasy wprost z modułu $+, wpisując
   $+ VTCEG
. Pozwoli to na śledzenie działania metody $+ EQPPGEV
, która zwraca uchwyt
   bazy danych FDJ.

    eby pokazać, jakie informacje zwraca metoda FDJ VTCEG
, zaprezentuję tutaj zapis
   działania programu insert-book.pl, dla którego metoda FDJ VTCEG
 została włączona na
   pierwszym poziomie debugowania. Do kodu programu insert-book.pl dodałem tylko jeden
   wiersz, zaraz po odwołaniu do metody $+ EQPPGEV
:
      FDJ VTCEG
 VORKPUGTVDQQMVTCEGVZV 

   Oto, co pojawiło się na ekranie podczas działania programu insert-book.pl:
     2QFCL +5$0 MUKæ MK 
     2QFCL V[VW MUKæ MK + NKMG 2GTN
     2QFCL CWVQTC MUKæ MK 4GWXGP / .GTPGT
     2QFCL CWVQTC MUKæ MK
     2QFCL Y[FCYEú MUKæ MK 2TGPVKEG*CNN
     2QFCL NKEDú UVTQP MUKæ MK 
     2QFCL FCVú Y[FCPKC 
;;;;// MUKæ MK 
     2QFCL EGPú Y FQNCTCEJ MUKæ MK 
     )QVQYG
304   Perl

      W tym czasie za kulisami moduł $+ zebrał następujące informacje o tej sesji:
            $+FD*#5*
ZHE VTCEG NGXGN UGV VQ  KP $+ PQVJTGCF
        FDFAFDA('6%*
          ('6%*  CV $+RO NKPG 
        FDFAFDA5614'
          5614'
 #WVQ%QOOKV    CV $+RO NKPG 
        FDFAFDA5614'
          5614'
 $GIWP9QTM    CV $+RO NKPG 
             DGIKPAYQTM  CV KPUGTVDQQMRN NKPG 
        FDFAUVARTGRCTG UVCVGOGPV  5'.'%6 CWVJQTAPCOG CWVJQTAKF (41/ #WVJQTU
        FDFAUVARTGRCTUG UVCVGOGPV  5'.'%6 CWVJQTAPCOG CWVJQTAKF (41/ #WVJQTU
             RTGRCTG
 5'.'%6 CWVJQTAPCOG CWVJQTAKF (41/ #WVJQTU %1'
              $+UV*#5*
Z CV KPUGTVDQQMRN NKPG 
        FDFAUVAGZGEWVG
             GZGEWVG
%1'  CV KPUGTVDQQMRN NKPG 
        FDFAUVAHGVEJ
             HGVEJTQYACTTC[TGH = (QQ $CT  ? TQY CV KPUGTVDQQMRN NKPG 
        FDFAUVAHGVEJ
        FDFAUVAHGVEJ
             HGEVJTQYACTTC[TGH WPFGH TQY CV KPUGTVDQQMRN NKPG 
        FDFAUVARTGRCTG UVCVGOGPV  5'.'%6 RWDNKUJGTAPCOG RWDNKUJGTAKF (41/ 2WDNKUJGTU
        FDFAUVARTGRCTUG UVCVGOGPV  5'.'%6 RWDNKUJGTAPCOG RWDNKUJGTAKF (41/ 2WDNKUJGTU
             RTGRCTG
 5'.'%6 RWDNKUJGTAPCOG RWDNKUJGTAKF (41/ 2WDNKUJGTU
               %1' $+UV*#5*
ZFE CV KPUGTVDQQMRN NKPG 
        FDFAUVAFGUVTQ[
             '5641; WPFGH CV KPUGTVDQQMRN NKPG 
        FDFAUVAGZGEWVG
             GZGEWVG
%1'  CV KPUGTVDQQMRN NKPG 
        FDFAUVAHGVEJ
             HGVEJTQYACTTC[TGH = 2TGPVKEG*CNN  ? TQY CV KPUGTVDQQMRN NKPG 
        FDFAUVAHGVEJ
        FDFAUVAHGVEJ
        FDFAUVAHGVEJ
             HGVEJTQYACTTC[TGH WPFGH TQY  CV KPUGTVDQQMRN NKPG 
        FDFAUVARTGRCTG UVCVGOGPV  +05'46 +061 $QQMU
            
KUDP VKVNG RWDNKUJGTAKF PWOARCIGU RWDAFCVG WUAFQNNCTARTKEG
            8#.7'5 
! ! ! ! ! ! 
        FDFAUVARTGRCTUG UVCVGOGPV  +05'46 +061 $QQMU
            
KUDP VKVNG RWDNKUJGTAKF PWOARCIGU
             RWDAFCVG WUAFQNNCTARTKEG 8#.7'5 
! ! ! ! ! ! 
             RTGRCTG
 +05'46 +061 $QQMU
            
KUDP VKVNG RWDNKUJGTAKF PWOARCIGU
             RWDAFCVG WUAFQNNCTARTKEG 8#.7'5 
! ! ! ! ! !
             %1' $+UV*#5*
ZHG CV KPUGTVDQQMRN NKPG 
        FDFAUVAFGUVTQ[
             '5641; WPFGH CV KPUGTVDQQMRN NKPG 
        FDFADKPFARJ
        FDFAUVATGDKPF
        FDFADKPFARJ
        FDFAUVATGDKPF
        FDFADKPFARJ
        FDFAUVATGDKPF
        FDFADKPFARJ
        FDFAUVATGDKPF

More Related Content

What's hot

Delphi dla .NET. Vademecum profesjonalisty
Delphi dla .NET. Vademecum profesjonalistyDelphi dla .NET. Vademecum profesjonalisty
Delphi dla .NET. Vademecum profesjonalistyWydawnictwo Helion
 
Programowanie skryptów powłoki
Programowanie skryptów powłokiProgramowanie skryptów powłoki
Programowanie skryptów powłokiWydawnictwo Helion
 
mod_perl. Podręcznik programisty
mod_perl. Podręcznik programistymod_perl. Podręcznik programisty
mod_perl. Podręcznik programistyWydawnictwo Helion
 
PHP5. Profesjonalne tworzenie oprogramowania
PHP5. Profesjonalne tworzenie oprogramowaniaPHP5. Profesjonalne tworzenie oprogramowania
PHP5. Profesjonalne tworzenie oprogramowaniaWydawnictwo Helion
 
PHP5, Apache i MySQL. Od podstaw
PHP5, Apache i MySQL. Od podstawPHP5, Apache i MySQL. Od podstaw
PHP5, Apache i MySQL. Od podstawWydawnictwo Helion
 

What's hot (7)

Delphi dla .NET. Vademecum profesjonalisty
Delphi dla .NET. Vademecum profesjonalistyDelphi dla .NET. Vademecum profesjonalisty
Delphi dla .NET. Vademecum profesjonalisty
 
Java. Rozmówki
Java. RozmówkiJava. Rozmówki
Java. Rozmówki
 
Programowanie skryptów powłoki
Programowanie skryptów powłokiProgramowanie skryptów powłoki
Programowanie skryptów powłoki
 
mod_perl. Podręcznik programisty
mod_perl. Podręcznik programistymod_perl. Podręcznik programisty
mod_perl. Podręcznik programisty
 
PHP5. Profesjonalne tworzenie oprogramowania
PHP5. Profesjonalne tworzenie oprogramowaniaPHP5. Profesjonalne tworzenie oprogramowania
PHP5. Profesjonalne tworzenie oprogramowania
 
Java. Wprowadzenie
Java. WprowadzenieJava. Wprowadzenie
Java. Wprowadzenie
 
PHP5, Apache i MySQL. Od podstaw
PHP5, Apache i MySQL. Od podstawPHP5, Apache i MySQL. Od podstaw
PHP5, Apache i MySQL. Od podstaw
 

Viewers also liked

PHP i MySQL. Dynamiczne strony WWW. Szybki start
PHP i MySQL. Dynamiczne strony WWW. Szybki startPHP i MySQL. Dynamiczne strony WWW. Szybki start
PHP i MySQL. Dynamiczne strony WWW. Szybki startWydawnictwo Helion
 
C++ Builder 6. Vademecum profesjonalisty
C++ Builder 6. Vademecum profesjonalistyC++ Builder 6. Vademecum profesjonalisty
C++ Builder 6. Vademecum profesjonalistyWydawnictwo Helion
 
Access 2003 PL. Ćwiczenia praktyczne
Access 2003 PL. Ćwiczenia praktyczneAccess 2003 PL. Ćwiczenia praktyczne
Access 2003 PL. Ćwiczenia praktyczneWydawnictwo Helion
 

Viewers also liked (7)

PHP i MySQL. Dynamiczne strony WWW. Szybki start
PHP i MySQL. Dynamiczne strony WWW. Szybki startPHP i MySQL. Dynamiczne strony WWW. Szybki start
PHP i MySQL. Dynamiczne strony WWW. Szybki start
 
Algorytmy i struktury danych
Algorytmy i struktury danychAlgorytmy i struktury danych
Algorytmy i struktury danych
 
ABC Access 2003 PL
ABC Access 2003 PLABC Access 2003 PL
ABC Access 2003 PL
 
C++ Builder 6. Vademecum profesjonalisty
C++ Builder 6. Vademecum profesjonalistyC++ Builder 6. Vademecum profesjonalisty
C++ Builder 6. Vademecum profesjonalisty
 
Dreamweaver MX. Ćwiczenia
Dreamweaver MX. ĆwiczeniaDreamweaver MX. Ćwiczenia
Dreamweaver MX. Ćwiczenia
 
Delphi 7 i bazy danych
Delphi 7 i bazy danychDelphi 7 i bazy danych
Delphi 7 i bazy danych
 
Access 2003 PL. Ćwiczenia praktyczne
Access 2003 PL. Ćwiczenia praktyczneAccess 2003 PL. Ćwiczenia praktyczne
Access 2003 PL. Ćwiczenia praktyczne
 

Similar to Perl (20)

Perl. Ćwiczenia
Perl. ĆwiczeniaPerl. Ćwiczenia
Perl. Ćwiczenia
 
Perl. Receptury. Wydanie II
Perl. Receptury. Wydanie IIPerl. Receptury. Wydanie II
Perl. Receptury. Wydanie II
 
Java. Usługi WWW. Vademecum profesjonalisty
Java. Usługi WWW. Vademecum profesjonalistyJava. Usługi WWW. Vademecum profesjonalisty
Java. Usługi WWW. Vademecum profesjonalisty
 
Programowanie. Od podstaw
Programowanie. Od podstawProgramowanie. Od podstaw
Programowanie. Od podstaw
 
PHP w mgnieniu oka
PHP w mgnieniu okaPHP w mgnieniu oka
PHP w mgnieniu oka
 
Serwisy internetowe. Programowanie
Serwisy internetowe. ProgramowanieSerwisy internetowe. Programowanie
Serwisy internetowe. Programowanie
 
C# i .NET
C# i .NETC# i .NET
C# i .NET
 
ABC Delphi 2006
ABC Delphi 2006ABC Delphi 2006
ABC Delphi 2006
 
TCP/IP. Szkoła programowania
TCP/IP. Szkoła programowaniaTCP/IP. Szkoła programowania
TCP/IP. Szkoła programowania
 
PHP5 i MySQL. Biblia
PHP5 i MySQL. BibliaPHP5 i MySQL. Biblia
PHP5 i MySQL. Biblia
 
PHP5. Obiekty, wzorce, narzędzia
PHP5. Obiekty, wzorce, narzędziaPHP5. Obiekty, wzorce, narzędzia
PHP5. Obiekty, wzorce, narzędzia
 
Po prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowanePo prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowane
 
Delphi 7 dla każdego
Delphi 7 dla każdegoDelphi 7 dla każdego
Delphi 7 dla każdego
 
PHP. Rozmówki
PHP. RozmówkiPHP. Rozmówki
PHP. Rozmówki
 
Spring. Zapiski programisty
Spring. Zapiski programistySpring. Zapiski programisty
Spring. Zapiski programisty
 
PHP, MySQL i Apache dla każdego. Wydanie II
PHP, MySQL i Apache dla każdego. Wydanie IIPHP, MySQL i Apache dla każdego. Wydanie II
PHP, MySQL i Apache dla każdego. Wydanie II
 
Visual C# .NET. Encyklopedia
Visual C# .NET. EncyklopediaVisual C# .NET. Encyklopedia
Visual C# .NET. Encyklopedia
 
Algorytmy w Perlu
Algorytmy w PerluAlgorytmy w Perlu
Algorytmy w Perlu
 
PHP i MySQL. Aplikacje bazodanowe
PHP i MySQL. Aplikacje bazodanowePHP i MySQL. Aplikacje bazodanowe
PHP i MySQL. Aplikacje bazodanowe
 
Delphi. Techniki bazodanowe i internetowe
Delphi. Techniki bazodanowe i internetoweDelphi. Techniki bazodanowe i internetowe
Delphi. Techniki bazodanowe i internetowe
 

More from Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 

More from Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

Perl

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI Perl KATALOG KSI¥¯EK Autor: Reuven M. Lerner T³umaczenie: M. Michalski, S. Dzieniszewski KATALOG ONLINE ISBN: 83-7361-169-X Tytu³ orygina³u: Core Perl ZAMÓW DRUKOWANY KATALOG Format: B5, stron: 45 Przyk³ady na ftp: 61 kB TWÓJ KOSZYK DODAJ DO KOSZYKA Ten kompletny przewodnik po Perlu szybko i wygodnie dostarcza do wiadczonym programistom odpowiednich technik i ilustruj¹cych je praktycznych przyk³adów kodu. Lektura tej ksi¹¿ki pozwoli Ci najpierw rozwin¹æ swoje dotychczasowe umiejêtno ci, CENNIK I INFORMACJE a nastêpnie zg³êbiæ tajniki podstawowych technik programowania w Perlu. Ksi¹¿ka rozpoczyna siê opisem podstawowej sk³adni jêzyka, przechodzi pó niej do obiektów, ZAMÓW INFORMACJE struktur danych i zasad przetwarzania tekstu. Nastêpnie wyja nia, jak korzystaæ O NOWO CIACH z dostarczonych przez Perl narzêdzi umo¿liwiaj¹cych pracê z plikami, dzia³anie programów w sieci czy wspó³pracê z relacyjnymi bazami danych. Na koniec pokazuje, ZAMÓW CENNIK jak wykorzystaæ pe³niê mo¿liwo ci Perla podczas tworzenia aplikacji WWW — zarówno prostych skryptów CGI, jak i w pe³ni zaawansowanych narzêdzi obs³uguj¹cych witryny WWW. CZYTELNIA Opisano miêdzy innymi: • Typy danych i podstawowe funkcje Perla FRAGMENTY KSI¥¯EK ONLINE • Zasady pisania i korzystania z modu³ów Perla • Sposoby korzystania z plików tekstowych i plików DBM • Interfejs DBI pozwalaj¹cy na korzystanie z baz danych i integrowanie baz danych ze stronami WWW • Programy CGI, modu³y mod_perl dla serwera Apache, cookie protoko³u HTTP oraz szablony HTML/Perla • Mason: oparty na Perlu system tworzenia zaawansowanych witryn WWW • Wykrywanie i usuwanie b³êdów, optymalizacja kodu oraz sprawy zwi¹zane z bezpieczeñstwem Od wielu ju¿ lat programi ci na ca³ym wiecie doceniaj¹ Perla za jego prostotê, wygodê i uniwersaln¹ zdolno æ do rozwi¹zywania szerokiego zakresu problemów; pocz¹wszy Wydawnictwo Helion od przetwarzania tekstu i administrowania systemem operacyjnym po komunikacjê ul. Chopina 6 z bazami danych i tworzenie stron WWW. Ksi¹¿ka „Perl” dostarcza programistom 44-100 Gliwice wiedzy niezbêdnej do tworzenia wszechstronnych, przejrzystych i bardzo wydajnych tel. (32)230-98-63 programów — niezale¿nie jakie bêd¹ zadania tworzonych przez niego aplikacji. e-mail: helion@helion.pl
  • 2. Spis treści Przedmowa .................................................................................................................................................. 9 Rozdział 1. Czym jest Perl? ........................................................................................................................15 1.1. Czym jest Perl?...................................................................................................... 15 1.2. Do czego Perl się nie nadaje? ................................................................................. 17 1.3. Licencje ................................................................................................................ 17 1.4. Wersje i standardy Perla......................................................................................... 18 1.5. Wsparcie techniczne .............................................................................................. 18 1.6. Pobieranie i instalacja Perla.................................................................................... 19 1.7. Pobieranie modułów z CPAN ................................................................................... 22 1.8. Podsumowanie ...................................................................................................... 25 Rozdział 2. Pierwsze kroki ....................................................................................................................... 27 2.1. Najprostsze programy............................................................................................. 28 2.2. Kompilator czy interpreter? ..................................................................................... 29 2.3. Wyrażenia i bloki.................................................................................................... 30 2.4. Zmienne................................................................................................................ 31 2.5. Skalary ................................................................................................................. 32 2.6. Listy i tablice ......................................................................................................... 41 2.7. Tablice asocjacyjne ................................................................................................ 48 2.8. Odwołania ............................................................................................................. 52 2.9. Zmienne leksykalne i globalne ................................................................................ 58 2.10. Podsumowanie .................................................................................................... 60 Rozdział 3. Kroki następne.........................................................................................................................61 3.1. Podstawowe funkcje wyjścia ................................................................................... 62 3.2. Czas ..................................................................................................................... 64 3.3. Podstawowe funkcje wejścia ................................................................................... 65 3.4. Operacje warunkowe .............................................................................................. 66 3.5. Operatory porównania ............................................................................................ 70 3.6. Operatory logiczne ................................................................................................. 72 3.7. Kolejność wykonywania operacji .............................................................................. 73 3.8. Pętle..................................................................................................................... 74
  • 3. 6 Perl 3.9. Sortowanie ............................................................................................................ 79 3.10. Pliki .................................................................................................................... 81 3.11. Zmienne wewnętrzne............................................................................................ 85 3.12. Funkcje przekształcające dane .............................................................................. 87 3.13. Uruchamianie programów zewnętrznych ................................................................. 92 3.14. Funkcja fork......................................................................................................... 95 3.15. Funkcja eval ........................................................................................................ 97 3.16. Podsumowanie .................................................................................................... 99 Rozdział 4. Procedury ...............................................................................................................................101 4.1. Informacje podstawowe ........................................................................................ 102 4.2. Wartości zwracane ............................................................................................... 102 4.3. Zmienne w procedurach ....................................................................................... 108 4.4. Argumenty procedur ............................................................................................. 112 4.5. Odwołania do procedur......................................................................................... 114 4.6. Bloki BEGIN i END................................................................................................ 116 4.7. Sygnały ............................................................................................................... 119 4.8. Podsumowanie .................................................................................................... 121 Rozdział 5. Wzorce tekstowe ..................................................................................................................123 5.1. Czym są wzorce tekstowe? ................................................................................... 124 5.2. Metaznaki ........................................................................................................... 126 5.3. Wyszukiwanie zakotwiczone .................................................................................. 129 5.4. Klasy znaków....................................................................................................... 130 5.5. Predefiniowane klasy znaków ................................................................................ 131 5.6. Nawiasy .............................................................................................................. 133 5.7. Pobieranie części łańcucha................................................................................... 133 5.8. Podstawianie....................................................................................................... 136 5.9. Zachłanność........................................................................................................ 137 5.10. Opcje dopasowywania i podstawiania .................................................................. 137 5.11. Funkcja study .................................................................................................... 141 5.12. Obiekty wzorców ................................................................................................ 141 5.13. Operator tr/// ................................................................................................... 142 5.14. Zastępowanie tekstów w wielu plikach................................................................. 144 5.15. Funkcja grep...................................................................................................... 144 5.16. Podsumowanie .................................................................................................. 145 Rozdział 6. Moduły ....................................................................................................................................147 6.1. Pakiety................................................................................................................ 147 6.2. Moduły................................................................................................................ 152 6.3. Eksportowanie symboli......................................................................................... 155 6.4. Kilka przykładowych modułów ............................................................................... 157 6.5. Dokumentowanie modułów przy użyciu formatu POD ............................................... 161 6.6. Podsumowanie .................................................................................................... 164 Rozdział 7. Obiekty....................................................................................................................................165 7.1. Obiekty ............................................................................................................... 166 7.2. Metody ............................................................................................................... 167 7.3. Dziedziczenie....................................................................................................... 170 7.4. Tworzenie obiektów i praca z nimi ......................................................................... 174 7.5. Podsumowanie .................................................................................................... 182
  • 4. Spis treści 7 Rozdział 8. Wiązanie .................................................................................................................................183 8.1. Wiązanie ............................................................................................................. 184 8.2. Wiązanie skalarów ............................................................................................... 185 8.3. Wiązanie tablic asocjacyjnych ............................................................................... 189 8.4. Wiązanie tablic .................................................................................................... 198 8.5. Podsumowanie .................................................................................................... 201 Rozdział 9. Praca z plikami .....................................................................................................................203 9.1. Podstawy pracy z plikami ...................................................................................... 204 9.2. Sięganie do dowolnego miejsca w pliku ................................................................. 206 9.3. Uchwyty plików .................................................................................................... 208 9.4. Korzystanie ze znaków globalnych ......................................................................... 214 9.5. Identyfikatory rzeczywiste i identyfikatory efektywne ................................................ 215 9.6. Uprawnienia plikowe ............................................................................................ 217 9.7. Programy suid i sgid............................................................................................. 219 9.8. Testowanie plików za pomocą operatorów unarnych................................................ 220 9.9. Funkcja stat ........................................................................................................ 224 9.10. Blokowanie plików ............................................................................................. 225 9.11. Katalogi ............................................................................................................ 227 9.12. Zmienianie nazw oraz usuwanie plików i katalogów............................................... 230 9.13. Powiązania ........................................................................................................ 232 9.14. Podsumowanie .................................................................................................. 233 Rozdział 10. Programy sieciowe i komunikacja między procesami....................................................235 10.1. Potoki ............................................................................................................... 236 10.2. Komunikacja poprzez sieć................................................................................... 243 10.3. Współpraca z protokołami internetowymi ............................................................. 250 10.4. Podsumowanie .................................................................................................. 261 Rozdział 11. Relacyjne bazy danych ........................................................................................................263 11.1. Czym właściwie jest relacyjna baza danych?......................................................... 264 11.2. Wprowadzenie do języka SQL .............................................................................. 265 11.3. Zapytanie SELECT.............................................................................................. 269 11.4. Złączenia .......................................................................................................... 274 11.5. Aktualizowanie i usuwanie rekordów .................................................................... 274 11.6. Indeksy ............................................................................................................. 275 11.7. Perl i bazy danych .............................................................................................. 275 11.8. Proste programy korzystające z DBI ..................................................................... 279 11.9. Podsumowanie .................................................................................................. 282 Rozdział 12. Tworzenie aplikacji dla baz danych...................................................................................283 12.1. Projektowanie bazy danych ................................................................................. 283 12.2. Pisanie aplikacji................................................................................................. 290 12.3. Usuwanie błędów w programach korzystających z DBI ........................................... 303 12.4. Podsumowanie .................................................................................................. 306 Rozdział 13. Naprawianie programów i zagadnienia bezpieczeństwa................................................307 13.1. Identyfikowanie problemów ................................................................................. 308 13.2. Gdy pojawi się problem ...................................................................................... 312 13.3. Tryb analizy zagrożeń.......................................................................................... 314
  • 5. 8 Perl 13.4. Wykrywanie i usuwanie błędów w kodzie .............................................................. 316 13.5. Szacowanie wydajności kodu .............................................................................. 323 13.6. Podsumowanie .................................................................................................. 326 Rozdział 14. Pisanie programów CGI ......................................................................................................327 14.1. Dynamiczne strony WWW.................................................................................... 327 14.2. Interfejs CGI ...................................................................................................... 332 14.3. Komunikaty o błędach i wykrywanie błędów w kodzie programów CGI ..................... 336 14.4. Przekierowanie do innej strony ............................................................................ 338 14.5. Inne metody modułu CGI .................................................................................... 341 14.6. Podsumowanie .................................................................................................. 342 Rozdział 15. Bardziej zło one programy CGI .........................................................................................343 15.1. Rejestracja użytkowników ................................................................................... 344 15.2. Cookies ............................................................................................................ 349 15.3. Tworzenie grafiki ................................................................................................ 354 15.4. Szablony ........................................................................................................... 358 15.5. Podsumowanie .................................................................................................. 361 Rozdział 16. Aplikacje WWW korzystające z baz danych .....................................................................363 16.1. Aktualizowanie kursów akcji................................................................................ 364 16.2. Kartki pocztowe ................................................................................................. 373 16.3. Personalizacja stron WWW z pomocą bazy danych ................................................ 378 16.4. Podsumowanie .................................................................................................. 388 Rozdział 17. mod_perl..............................................................................................................................389 17.1. Instalowanie i konfiguracja mod_perl ................................................................... 390 17.2. Dyrektywy konfiguracyjne .................................................................................... 392 17.3. Trzy proste moduły obsługujące........................................................................... 393 17.4. Moduł Apache::Registry ...................................................................................... 399 17.5. Przydatne moduły............................................................................................... 400 17.6. Podsumowanie .................................................................................................. 406 Rozdział 18. Mason...................................................................................................................................409 18.1. Pakiet Mason .................................................................................................... 409 18.2. Komponenty autohandler i dhandler .................................................................... 417 18.3. Komponent autohandler ..................................................................................... 417 18.4. Zarządzanie sesją użytkownika............................................................................ 419 18.5. Podsumowanie .................................................................................................. 426 Dodatek A Bibliografia .............................................................................................................................427 A.1. Książki poświęcone Perlowi .................................................................................. 427 A.2. Periodyki ............................................................................................................. 429 A.3. Książki o sieci WWW ............................................................................................ 429 A.4. Książki o bazach danych....................................................................................... 430 A.5. Użyteczne witryny WWW ........................................................................................ 431 Skorowidz ................................................................................................................................................433
  • 6. Tworzenie aplikacji dla baz danych W tym rozdziale: n Projektowanie bazy danych n Tworzenie aplikacji dla baz danych n Wykrywanie błędów w programach &$+ Poprzedni rozdział był wprowadzeniem do zagadnień związanych z bazami danych, a w szcze- gólności do języka SQL i modułu &$+. W tym rozdziale wykorzystamy te narzędzia do przy- gotowania zestawu aplikacji obsługujących bazę danych. Po drodze przyjrzymy się projektowaniu bazy danych, co — podobnie jak w przypadku projektowania programu — jest kluczową, ale często niedocenianą częścią procesu pro- gramowania. W szczególności omówimy proces normalizacji, który poprawia efektywność bazy danych i czyni ją bardziej elastyczną, redukując jednocześnie mo liwość pojawienia się błędów. Aplikacje, które stworzymy, będą wykorzystywać zarówno techniki opisane w poprzednim rozdziale, jak i nowe typy danych SQL oraz metody interfejsu &$+. Przyjrzymy się bli ej metodzie VTCEG, która ułatwia wykrywanie błędów w zapytaniach SQL. Rozdział ten dostarcza podstawowej wiedzy na temat procesu pisania programów współ- działających z bazą danych, włączając w to projektowanie tabel i wykrywanie błędów w przy- gotowanych programach. 12.1. Projektowanie bazy danych Nasze zadanie polega na skomputeryzowaniu katalogu ksią ek sprzedawanych w pewnej księgarni. Zbudujemy bazę danych księgarni w systemie PostgreSQL i napiszemy w Perlu aplikacje, które pozwolą nam na obsługę danych zawartych w bazie.
  • 7. 284 Perl Pierwszym krokiem podczas tworzenia aplikacji bazy danych jest zawsze stworzenie tabel. Opiszę tutaj proces tworzenia prostego projektu bazy danych, omawiając pokrótce proble- my pojawiające się w większości aplikacji baz danych. 12.1.1. Tabela Books Poniewa księgarni potrzebny jest katalog ksią ek oferowanych do sprzeda y, trzeba za- cząć od przygotowania tabeli $QQMU, której wiersze będą przechowywać dane o poszczegól- nych ksią kach (identyfikator ksią ki, kod ISBN, tytuł, autora, wydawcę, liczbę stron, datę wydania oraz cenę ksią ki): %4'#6' 6#$.' $QQMU DQQMAKF 5'4+#. 016 07.. KUDP 6':6 016 07.. VKVNG 6':6 016 07.. CWVJQT 6':6 016 07.. RWDNKUJGT 6':6 016 07.. PWOARCIGU 07/'4+% 016 07.. RWDAFCVG #6' 016 07.. WUAFQNNCTARTKEG 07/'4+% 016 07.. 24+/#4; -'; DQQMAKF 70+37' KUDP Nasza tabela $QQMU wygląda podobnie jak tabele, które prezentowałem w rozdziale 11., niemniej pojawia się parę typów danych oraz ograniczeń, których jeszcze nie omawialiśmy: n kolumna daty wydania RWDAFCVG jest typu #6' (data). Jest to typ bardzo podobny do typu 6+/'56#/2 (znacznik czasu), ale zawiera samą datę, bez informacji o godzinie; n kolumna ceny WUAFQNNCTARTKEG została zdefiniowana jako kolumna typu 07/'4+% , co oznacza, e mo e zawierać sześciocyfrowe liczby posiadające dwie cyfry po przecinku. Tak więc mo emy sprzedawać ksią ki o cenie do 9999,99 dolarów; n kolumna KUDP przechowuje niepowtarzalny i niezmienny kod ISBN (ang. International Standard Book Number), który mógłby pełnić funkcję klucza głównego. Niemniej kody ISBN są dość długie, a zazwyczaj dobrze jest, aby klucz główny był tak krótki, jak to tylko mo liwe. Aby upewnić się, e wartości w kolumnie KUDP będą niepowtarzalne (choć nie są one kluczem głównym), mo emy dodać do definicji tabeli ograniczenie 70+37', które automatycznie utworzy indeks dla podanej kolumny. Z technicznego punktu widzenia zaprezentowana tutaj definicja tabeli $QQMU jest w pełni poprawna. Niemniej w momencie, gdy zaczniemy korzystać z tej tabeli, ujawnią się pewne istotne problemy.
  • 8. Rozdział 12. n Tworzenie aplikacji dla baz danych 285 Załó my, e księgarnia chciałaby przygotować katalog ksią ek wydawnictwa Prentice-Hall. Przedstawione tu zapytanie powinno pobrać nazwy wszystkich ksią ek wydanych przez Prentice-Hall: 5'.'%6 VKVNG (41/ $QQMU 9*'4' RWDNKUJGT 2TGPVKEG*CNN 14'4 $; VKVNG Co się jednak stanie, jeśli jedna z ksią ek będzie miała w kolumnie RWDNKUJGT wydawcę podanego jako 2TGPVKEG *CNN zamiast 2TGPVKEG*CNN? Taka ksią ka oczywiście nie będzie spełniać wymogów stawianych przez nasze zapytanie i w związku z tym nie trafi do katalogu. Podobne problemy pojawiają się równie podczas wyszukiwania ksią ek napisanych przez określonego autora. Jeśli osoba wpisująca ksią kę do bazy przez pomyłkę źle wpisze na- zwisko autora, to ksią ka ta nie pojawi się w odpowiedzi na zapytanie 5'.'%6 pobierające autora (CWVJQT) o określonym nazwisku. 12.3.2. Normalizacja tabeli Books Rozwiązaniem tego problemu jest normalizacja danych, która pozwala upewnić się, e dane wpisywane będą do bazy w jeden tylko sposób. Znormalizowane bazy danych cechuje znacz- nie mniejsze ryzyko pojawienia się uszkodzonych lub niezsynchronizowanych danych. Bazy takie są równie znacznie wydajniejsze ni bazy, które nie zostały znormalizowane. Aby znormalizować tabelę $QQMU, przygotujemy dwie nowe tabele: 2WDNKUJGTU (wydawcy) i #WVJQTU (autorzy). Tabele te będą pozwalały na wpisanie ka dego autora i ka dego wy- dawcy do bazy danych tylko raz. Dodatkowo wykorzystamy mechanizm kluczy obcych wskazujących na te wartości (patrz: sekcja 11.3.6): %4'#6' 6#$.' #WVJQTU CWVJQTAKF 5'4+#. 016 07.. CWVJQTAPCOG 6':6 016 07.. 24+/#4; -'; CWVJQTAKF %4'#6' 6#$.' 2WDNKUJGTU RWDNKUJGTAKF 5'4+#. 016 07.. RWDNKUJGTAPCOG 6':6 016 07.. 24+/#4; -'; RWDNKUJGTAKF 70+37' RWDNKUJGTAPCOG %4'#6' 6#$.' $QQMU DQQMAKF 5'4+#. 016 07..
  • 9. 286 Perl KUDP 6':6 016 07.. VKVNG 6':6 016 07.. CWVJQTAKF +06')'4 016 07.. 4'('4'0%'5 #WVJQTU RWDNKUJGTAKF +06')'4 016 07.. 4'('4'0%'5 2WDNKUJGTU PWOARCIGU 07/'4+% 016 07.. RWDAFCVG #6' 016 07.. WUAFQNNCTARTKEG 07/'4+% 016 07.. 24+/#4; -'; DQQMAKF 70+37' KUDP Warto zauwa yć, e tabele te nakładają ograniczenie unikatowości na nazwę wydawnictwa, ale nie nakładają go na nazwiska autorów. Mo e się w końcu zdarzyć kilku autorów o na- zwisku John Smith, ale raczej nie powinno istnieć więcej ni jedno wydawnictwo o nazwie Prentice Hall. Znormalizowane tabele gwarantują, e nazwiska autorów i nazwy wydawnictw będą wy- stępowały w tej samej formie w całej bazie danych. Co więcej, zmiana nazwy wydawnic- twa wymagać będzie teraz aktualizacji tylko jednego wiersza w tabeli 2WDNKUJGTU zamiast wielu wierszy w tabeli $QQMU. Jakby tych korzyści było jeszcze mało, tabela $QQMU zmniej- szy znacznie swoje rozmiary dzięki zastąpieniu dwóch kolumn typu 6':6 kolumnami typu +06')'4. Znormalizowane tabele zajmować będą mniej miejsca na dysku i w pamięci, co przyspieszy działanie bazy danych. Obecnie nasze zapytanie pobierające ksią ki wydawnictwa Prentice-Hall wymaga wykona- nia złączenia: 5'.'%6 VKVNG (41/ $QQMU $ 2WDNKUJGTU 2 9*'4' 2RWDNKUJGTAPCOG 2TGPVKEG*CNN #0 2RWDNKUJGTAKF $RWDNKUJGTAKF 14'4 $; VKVNG Złączenie razem trzech tablic pozwoli na zdobycie listy wszystkich ksią ek napisanych przez określonego autora, takiego jak np. Paul Krugman: 5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG $RWDAFCVG $WUAFQNNCTARTKEG (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU # 9*'4' #CWVJQTAPCOG 2CWN -TWIOCP #0 $CWVJQTAKF #CWVJQTAKF #0 $RWDNKUJGTAKF 2RWDNKUJGTAKF 14'4 $; VKVNG 12.1.3. Głębsza normalizacja Przedstawiona przed chwilą wersja tabeli $QQMU była niewątpliwie krokiem w dobrym kie- runku. Co jednak, jeśli dana ksią ka ma więcej ni jednego autora? Dotychczasowa defini- cja tabeli nie dopuszcza takiej sytuacji.
  • 10. Rozdział 12. n Tworzenie aplikacji dla baz danych 287 Jednym z mo liwych rozwiązań tego problemu jest dodanie do tabeli $QQMU kilku nowych kolumn. Mo na na przykład zmienić kolumnę CWVJQTAKF na CWVJQTAKF i dodać trzy ko- lumny dopuszczające wartość 07.. (CWVJQTAKF, CWVJQTAKF oraz CWVJQTAKF) przeznaczone dla dodatkowych autorów. To rozwiązanie jednak sztucznie ogranicza liczbę autorów, których mo e posiadać ksią ka, i prowadzi do niepotrzebnego marnotrawienia przestrzeni na dysku w przypadku ka dej ksią ki, która będzie miała mniej autorów. Dodatkowo nadmiernie komplikuje wszystkie za- pytania — rozwa my na przykład listę ksią ek napisanych przez Paula Krugmana: 5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG $RWDAFCVG $WUAFQNNCTARTKEG (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU # 9*'4' #CWVJQTAPCOG 2CWN -TWIOCP #0 $CWVJQTAKF #CWVJQTAKF 14 $CWVJQTAKF #CWVJQTAKF 14 $CWVJQTAKF #CWVJQTAKF 14 $CWVJQTAKF #CWVJQTAKF #0 $RWDNKUJGTAKF 2RWDNKUJGTAKF 14'4 $; VKVNG Lepszym rozwiązaniem jest zupełne usunięcie informacji o autorze z tabeli $QQMU. Zamiast tego przygotujemy tabelę $QQM#WVJQTU (autorzy ksią ki) posiadającą dwie kolumny — jedną będzie klucz obcy do tabeli $QQMU, a drugą klucz obcy do tabeli #WVJQTU. A oto poprawiona definicja tabeli $QQMU wraz z tabelą $QQM#WVJQTU: %4'#6' 6#$.' $QQMU DQQMAKF 5'4+#. 016 07.. KUDP 6':6 016 07.. VKVNG 6':6 016 07.. RWDNKUJGTAKF +06')'4 016 07.. 4'('4'0%'5 2WDNKUJGTU PWOARCIGU 07/'4+% 016 07.. RWDAFCVG #6' 016 07.. WUAFQNNCTARTKEG 07/'4+% 016 07.. 24+/#4; -'; DQQMAKF 70+37' KUDP %4'#6' 6#$.' $QQM#WVJQTU DQQMAKF +06')'4 016 07.. 4'('4'0%'5 $QQMU CWVJQTAKF +06')'4 016 07.. 4'('4'0%'5 #WVJQTU 70+37' DQQMAKF CWVJQTAKF Zarówno identyfikator ksią ki (DQQMAKF), jak i identyfikator autora (CWVJQTAKF) mogą pojawić się w tabeli wielokrotnie. Powinniśmy jednak zagwarantować, eby ka dy autor w odniesie- niu do konkretnej ksią ki pojawiał się tylko raz. Robimy to, stosując ograniczenie 70+37' łącznie na dwóch kolumnach zamiast na pojedynczej kolumnie.
  • 11. 288 Perl Po dodaniu tabeli $QQM#WVJQTU zapytanie odszukujące wszystkie ksią ki napisane przez Paula Krugmana wymagać będzie wykonania złączenia czterech tabel: 5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG $RWDAFCVG $WUAFQNNCTARTKEG (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU # $QQM#WVJQTU $# 9*'4' #CWVJQTAPCOG 2CWN -TWIOCP #0 #CWVJQTAKF $#CWVJQTAKF #0 $#DQQMAKF $DQQMAKF #0 $RWDNKUJGTAKF 2RWDNKUJGTAKF 14'4 $; VKVNG Z kolei następne zapytanie zwraca ksią kę o numerze ISBN , zwracając jeden wiersz dla ka dego autora ksią ki: 5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG $RWDAFCVG $WUAFQNNCTARTKEG (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU # $QQM#WVJQTU $# 9*'4' $KUDP #0 $DQQMAKF $#DQQMAKF #0 $#CWVJQTAKF #CWVJQTAKF #0 $RWDNKUJGTAKF 2RWDNKUJGTAKF 14'4 $; VKVNG Jak widać, prawidłowo zaprojektowana baza danych pozwala na uzyskanie odpowiedzi na wiele ró nych pytań — nawet jeśli nie uwzględnialiśmy ich podczas projektowania bazy. 12.1.4. Indeksy Jak pisałem w podrozdziale 11.6, nale y dodawać indeks do ka dej kolumny, która mo e pojawiać się w klauzuli 9*'4'. Klucze główne i kolumny oznaczone jako 70+37' są indek- sowane automatycznie, co oszczędza nam trochę pracy. W naszych tabelach jest jednak jeszcze kilka kolumn, na których prawdopodobnie równie wykonywane będą zapytania. %4'#6' +0': CWVJQTAPCOGAKPFGZ 10 #WVJQTU CWVJQTAPCOG %4'#6' +0': RWDNKUJGTAPCOGAKPFGZ 10 2WDNKUJGTU RWDNKUJGTAPCOG %4'#6' +0': DQQMAVKVNGAKPFGZ 10 $QQMU VKVNG %4'#6' +0': DQQMARWDNKUJGTAKFAKPFGZ 10 $QQMU RWDNKUJGTAKF %4'#6' +0': DQQMARWDFCVGAKPFGZ 10 $QQMU RWDAFCVG %4'#6' +0': DQQMAWUAFQNNCTARTKEGAKPFGZ 10 $QQMU WUAFQNNCTARTKEG %4'#6' +0': CWVJQTAKFAKPFGZ 10 $QQM#WVJQTU CWVJQTAKF Przygotowanie tych indeksów sprawi, e nawet jeśli księgarnia oferować będzie kilka mi- lionów ksią ek, łatwo i szybko je odnajdziemy, poszukując ksią ek według tytułu, autora, daty publikacji czy ceny.
  • 12. Rozdział 12. n Tworzenie aplikacji dla baz danych 289 12.1.5. Integralność powiązań Nasze obecne definicje tabel zabraniają wstawiania wartości 07.. do kolumn tytułów ksią- ek i kodów ISBN. Mo e się jednak zdarzyć, e przez przypadek do tej lub innej kolumny wstawimy pusty łańcuch. Poniewa tworzona baza danych jest centralnym miejscem zbierania informacji o ksią kach dostępnych w księgarni, przechowywane w niej dane muszą być na tyle wiarygodne, na ile to tylko mo liwe. Słowo kluczowe %*'%- bazy PostgreSQL pozwala na nało enie na ko- lumny dodatkowych ograniczeń, w wyniku których wprowadzane dane przechodzić będą dodatkowe testy. Na przykład tabelę $QQMU mo na przedefiniować w następujący sposób: %4'#6' 6#$.' $QQMU DQQMAKF 5'4+#. 016 07.. KUDP 6':6 016 07.. %*'%- KUDP VKVNG 6':6 016 07.. %*'%- VKVNG `
  • 13. =#? RWDNKUJGTAKF +06')'4 016 07.. 4'('4'0%'5 2WDNKUJGTU PWOARCIGU 07/'4+% 016 07.. %*'%- PWOARCIGU RWDAFCVG #6' 016 07.. WUAFQNNCTARTKEG 07/'4+% 016 07.. %*'%- WUAFQNNCTARTKEG 24+/#4; -'; DQQMAKF 70+37' KUDP Taka poprawiona definicja tabeli $QQMU uniemo liwia wpisanie do kolumny KUDP pustego łańcucha, gwarantuje, e kolumna VKVNG zawierać będzie przynajmniej jedną literę lub cyfrę (korzystając w tym celu z niewra liwego na rozmiar liter operatora `
  • 14. PostgreSQL), i wy- maga, eby wartości w kolumnach PWOARCIGU i WUAFQNNCTARTKEG były liczbami dodatnimi. PostgreSQL będzie od tej pory odmawiać dodawania do bazy ksią ek, które łamać będą jedno lub więcej z tak zdefiniowanych ograniczeń. Jeśli na przykład spróbujemy dodać ksią - kę nieposiadającą tytułu: +05'46 +061 $QQMU KUDP VKVNG RWDNKUJGTAKF PWOARCIGU RWDAFCVG WUAFQNNCTARTKEG 8#.7'5 GE — PostgreSQL zwróci następujący komunikat o błędzie: '4414 'ZGE#RRGPF TGLGEV FWG VQ %*'%- EQPUVTCKPV DQQMUAVKVNG Tego rodzaju ograniczenia mogą się wydawać nonsensowne lub zbyteczne, niemniej wcale tak nie jest. Bez nich moglibyśmy przypadkowo wprowadzić do bazy danych nieprawidłowe dane. Naprawianie bazy danych zawierającej niepoprawne lub niespójne dane jest skompli- kowanym i pracochłonnym zadaniem, szczególnie jeśli baza danych musi być cały czas do- stępna. Ograniczenie %*'%- pozwala na uniknięcie takich sytuacji, wymuszając poprawność informacji zapisywanych w bazie danych.
  • 15. 290 Perl 12.1.6. Kategorie ksią ek Chcielibyśmy tak e przypisać ka dą ksią kę do jednej lub więcej kategorii. Najprostszy sposób polega na przygotowaniu pary tabel podobnych do tych, które przygotowaliśmy dla autorów — tabeli %CVGIQTKGU z nazwami kategorii i tabeli %CVGIQT[$QQMU, która powią e te kategorie z ksią kami: %4'#6' 6#$.' %CVGIQTKGU ECVGIQT[AKF 5'4+#. 016 07.. ECVGIQT[APCOG 6':6 016 07.. 24+/#4; -'; ECVGIQT[AKF 70+37' ECVGIQT[APCOG %4'#6' 6#$.' $QQM%CVGIQTKGU DQQMAKF +06')'4 016 07.. 4'('4'0%'5 2WDNKUJGTU ECVGIQT[AKF +06')'4 016 07.. 4'('4'0%'5 %CVGIQTKGU 70+37' DQQMAKF ECVGIQT[AKF %4'#6' +0': ECVGIQT[AKFAKPFGZ 10 $QQM%CVGIQTKGU ECVGIQT[AKF 12.2. Pisanie aplikacji Gdy baza danych jest gotowa, mo na przygotować programy Perla, które będą z nią współ- pracować. Jeden zestaw programów pozwoli personelowi księgarni wprowadzać, aktuali- zować i usuwać informacje na temat ksią ek, autorów i wydawców. Drugi przeznaczony będzie dla klientów księgarni, eby z jego pomocą mogli odnaleźć w bazie danych intere- sujące ich ksią ki. 12.2.1. Wprowadzanie informacji o autorach Kusić nas mo e, aby zacząć od przygotowania aplikacji pozwalającej na wprowadzanie do bazy danych informacji o ksią kach. Jednak musimy pamiętać, e kolumna RWDNKUJGTAKF w tabeli $QQMU jest kluczem obcym tabeli 2WDNKUJGTU, co oznacza, ze przed zapełnieniem tabeli $QQMU trzeba najpierw wypełnić tabelę 2WDNKUJGTU. Pierwszy z przedstawionych programów, insert-author.pl, łączy się z serwerem Postgre- SQL, pobiera od u ytkownika nazwisko autora ksią ki i wykonuje odpowiednie zapytanie +05'46 wstawiające autora do bazy. Jeśli coś pójdzie nie tak, zakończy pracę, sygnalizując krytyczny błąd.
  • 16. Rozdział 12. n Tworzenie aplikacji dla baz danych 291 Program ten wykonuje prosty test integralności danych na poziomie aplikacji, aby upewnić się, e nazwisko autora zawiera przynajmniej jeden znak. Większość aplikacji współpracu- jących z bazami danych sprawdza wprowadzane dane dwukrotnie: na poziomie definicji ta- beli (ograniczenie %*'%-) i ponownie na poziomie aplikacji. Pierwszy test sprawdza, czy baza danych nie zawiera niespójnych lub uszkodzonych danych, a drugi pozwala na przechwy- tywanie błędów i przygotowywanie czytelnych komunikatów o błędach dla u ytkownika. WUTDKPRGTN PCYC RNKMW KPUGTVCWVJQTRN WUG UVTKEV WUG YCTPKPIU WUG $+ 2Q æE UKú DCæ FCP[EJ O[ WUGTPCOG TGWXGP O[ RCUUYQTF O[ FDJ $+ EQPPGEV $+2IFDPCOGEQTGRGTN WUGTPCOG RCUUYQTF ] #WVQ%QOOKV 2TKPV'TTQT _ ^^ FKG $ æF æEGPKC DCæ $+GTTUVT 2QDKGT QF W [VMQYPKMC PCYKUMQ PQYGIQ CWVQTC RTKPV 2QFCL PCYKUMQ CWVQTC O[ CWVJQTAPCOG EJQOR CWVJQTAPCOG 0CYKUMQ CWVQTC OWUK CYKGTCè RT[PCLOPKGL LGFGP PCM KH CWVJQTAPCOG ` Y ] RTKPV 0CYKUMQ CWVQTC OWUK CYKGTCè RTKPV EQ PCLOPKGL LGFGP PCM -Q Eú RTCEúP _ ,G NK PCYKUMQ CWVQTC LGUV 1- YUVCY LG GNUG ] 7UW PKGRQVTGDPG URCELG PCYKUMC CWVQTC CWVJQTAPCOG ` U@U I CWVJQTAPCOG ` UU I 2T[IQVWL CR[VCPKG O[ USN +05'46 +061 #WVJQTU CWVJQTAPCOG 8#.7'5 ! O[ UWEEGUU FDJ FQ USN WPFGH CWVJQTAPCOG KH UWEEGUU ] RTKPV 9UVCYK GO FQ DC[ CWVQTC CWVJQTAPCOG P _ GNUG ] FKG $ æF Y[YQ CPKC CR[VCPKC 53. USN $+GTTUVT _ _ COMPKL RQ æEGPKG DCæ FCP[EJ FDJ FKUEQPPGEV
  • 17. 292 Perl Warto przyjrzeć się odwołaniu do metody FDJ FQ w programie insert-author.pl. Metoda FQ interfejsu $+ przeznaczona jest dla tych zapytań +05'46 i 72#6', które nie muszą pobie- rać wyników zapytania za pośrednictwem uchwytu UVJ. Pierwszy argument metody FDJ FQ jest łańcuchem zawierającym instrukcję SQL, a drugi odwołaniem do tablicy asocja- cyjnej zawierającej definicje atrybutów (lub wartość WPFGH). Pozostałe argumenty są warto- ściami, jakie interfejs $+ powinien przypisać symbolom zastępczym w instrukcji SQL. Metoda FDJ FQ zwraca liczbę zmienionych przez nią wierszy w tabeli. 12.2.2. Wprowadzanie kategorii Program insert-category.pl wstawiający nową kategorię do tabeli %CVGIQTKGU jest bardzo podobny do programu insert-author.pl. Niemniej tym razem istnieje pewna pułapka: ko- lumna ECVGIQT[APCOG została zdefiniowana jako 70+37'. Nasza aplikacja mogłaby ignoro- wać ten wymóg, próbując na ślepo wstawiać nowe nazwy kategorii do tabeli %CVGIQTKGU. Gdyby baza PostgreSQL odmówiła dodania nowej kategorii, moglibyśmy przechwycić błąd i zaraportować go u ytkownikowi. Tutaj jednak zastosowaliśmy bardziej wyszukane rozwiązanie, które wymaga sprawdzenia bazy danych w celu ustalenia, czy taka nazwa kategorii nie została ju wcześniej wprowa- dzona. To jednak pociąga za sobą konieczność wykonania zapytania 5'.'%6 (aby pobrać nazwy ju istniejących kategorii), a dopiero potem zapytania +05'46 (aby wstawić nową kate- gorię). Co jednak, jeśli ktoś inny spróbuje wykonać między tymi dwoma zapytaniami po- dobne zapytanie +05'46? Rozwiązanie, tak jak to zostało wspomniane w sekcji 11.7.4 w poprzednim rozdziale, pole- ga na połączeniu zapytań 5'.'%6 i +05'46 w pojedynczej transakcji. W ten sposób upew- niamy się, e nikt inny nie zmodyfikuje bazy danych między obydwoma naszymi zapyta- niami. Obsługę transakcji mo na włączyć, przypisując atrybutowi #WVQ%QOOKV wartość (#.5'. Wygodniej jest jednak skorzystać z metody FDJ DGIKPAYQTM , która wyłączy atrybut #W VQ%QOOKV na czas pojedynczej transakcji — do momentu wywołania metody FDJ EQOOKV zatwierdzającej transakcję lub metody FDJ TQNNDCEM wycofującej transakcję. Kod programu będzie więc najpierw pytał u ytkownika o nazwę nowej kategorii, następnie za pomocą zapytania 5'.'%6 sprawdzi, czy takiej nazwy ju nie ma, a jeśli taka kategoria ju istnieje — przerwie wykonywanie transakcji, przywołując metodę FDJ TQNNDCEM . Wy- cofanie transakcji nie jest w tym przypadku tak naprawdę konieczne, poniewa nie zmody- fikowaliśmy adnej tabeli. Ja jednak zawsze staram się postępować przezornie i przerywam zapytanie za pomocą metody FDJ TQNNDCEM . Gdy ju dane przejdą wszystkie testy na poziomie aplikacji, wykonywane jest zapytanie +05'46 i wywoływana metoda FDJ EQOOKV zatwierdzająca transakcję. Warto zauwa yć, e program insert-category.pl działa z włączonym atrybutem 4CKUG'TTQT. Oznacza to, e nie ma potrzeby sprawdzania wartości zwracanych przez procedury RTGRCTG i GZGEWVG, poniewa program zakończy działanie, sygnalizując krytyczny błąd, za ka dym razem, gdy natknie się na błąd bazy danych. WUTDKPRGTN PCYC RNKMW KPUGTVECVGIQT[RN
  • 18. Rozdział 12. n Tworzenie aplikacji dla baz danych 293 WUG UVTKEV WUG YCTPKPIU WUG $+ 2Q æE UKú DCæ FCP[EJ O[ WUGTPCOG TGWXGP O[ RCUUYQTF O[ FDJ $+ EQPPGEV $+2IFDPCOGEQTGRGTN WUGTPCOG RCUUYQTF ] #WVQ%QOOKV 4CKUG'TTQT _ ^^ FKG $ æF æEGPKC DCæ $+GTTUVT 2QDKGT QF W [VMQYPKMC PCYú PQYGL MCVGIQTKK RTKPV 2QFCL PCYú PQYGL MCVGIQTKK O[ ECVGIQT[APCOG EJQOR ECVGIQT[APCOG 0CYC MCVGIQTKK OWUK CYKGTCè RT[PCLOPKGL LGFGP PCM KH ECVGIQT[APCOG ` Y ] RTKPV 0CYC MCVGIQTKK OWUK CYKGTCè RTKPV EQ PCLOPKGL LGFGP PCM 'ZKVKPIP _ ,G NK PCYC MCVGIQTKK LGUV 1- URTÎDWL Læ YUVCYKè GNUG ] 7UW PKGRQVTGDPG URCELG ECVGIQT[APCOG ` U@U I ECVGIQT[APCOG ` UU I 9[ æE #WVQ%QOOKV PC ECU LGFPGL VTCPUCMELK 2QQUVCPKG QP Y[ æEQP[ FQ ECUW Y[YQ CPKC OGVQF[ FDJ EQOOKV NWD FDJ TQNNDCEM FDJ DGIKPAYQTM %[ VCMC PCYC MCVGIQTKK LW LGUV Y DCKG FCP[EJ! ,G NK VCM Y[EQHCL VTCPUCMELú RQKPHQTOWL W [VMQYPKMC Q RTQDNGOKG K CMQ E RTCEú 7VYÎT CR[VCPKG O[ UGNGEVAUSN 5'.'%6 %1706 ECVGIQT[AKF UGNGEVAUSN (41/ %CVGIQTKGU YJGTG ECVGIQT[APCOG ! 2T[IQVWL KPUVTWMELú O[ UVJ FDJ RTGRCTG UGNGEVAUSN 9[MQPCL KPUVTWMELú UVJ GZGEWVG ECVGIQT[APCOG 2QDKGT Y[PKM O[ ECVGIQT[ACNTGCF[AGZKUVU UVJ HGVEJTQYACTTC[ CMQ E VQ CR[VCPKG UVJ HKPKUJ KH ECVGIQT[ACNTGCF[AGZKUVU
  • 19. 294 Perl ] RTKPV -CVGIQTKC ECVGIQT[APCOG D[ C LW RTKPV FQFCPC FQ DC[P5RTÎDWL YRKUCè KPPæ PCYúP 6TCPUCMELC Y[EQHCPC FDJ TQNNDCEM _ GNUG ] 2T[IQVWL CR[VCPKG +05'46 O[ USN +05'46 +061 %CVGIQTKGU ECVGIQT[APCOG 8#.7'5 ! 2T[IQVWL KPUVTWMELú O[ UWEEGUUHWNN[AKPUGTVGF FDJ FQ USN WPFGH ECVGIQT[APCOG KH UWEEGUUHWNN[AKPUGTVGF ] RTKPV QFC GO FQ DC[ MCVGIQTKú ECVGIQT[APCOG P FDJ EQOOKV _ GNUG ] RTKPV $ æF YUVCYKCPKC $+GTTUVT P FDJ TQNNDCEM _ _ _ CMQ E RQ æEGPKG DCæ FCP[EJ FDJ FKUEQPPGEV Jak łatwo przewidzieć, program insert-publisher.pl będzie wyglądał bardzo podobnie do programu insert-category.pl. 12.2.3. Modyfikowanie ju istniejących wartości Program insert-category.pl działa całkiem sprawnie — co jednak, jeśli ktoś wprowadzi do bazy złą nazwę kategorii? Baza danych księgarni potrzebuje jakiegoś sposobu modyfiko- wania ju istniejących nazw kategorii (to samo dotyczy wstawionych nazw autorów i wy- dawców, ale tutaj omawiać będziemy tylko przypadek kategorii). Program update-category.pl będzie wymagał podania przez u ytkownika dwóch wartości: starej nazwy kategorii QNFAECVGIQT[APCOG i nowej kategorii PGYAECVGIQT[APCOG. Mo e się jednak zdarzyć, e u ytkownik popełni błąd przy wpisywaniu starej nazwy kategorii, po- dając nazwę, której nie ma w bazie danych, i wówczas klauzula 9*'4' zapytania SQL nie będzie pasowała do adnego wiersza tabeli %CVGIQTKGU. Moduł 6GTO%QORNGVG dostępny w sieci %2#0 (patrz: podrozdział 1.6) pozwala na ograni- czenie liczby przyjmowanych od u ytkownika danych wejściowych. Moduł 6GTO%QORNGVG automatycznie eksportuje do przestrzeni nazw kodu przywołującego procedurę %QORNGVG.
  • 20. Rozdział 12. n Tworzenie aplikacji dla baz danych 295 Procedura %QORNGVG wymaga przesłania jej dwóch argumentów. Pierwszy z nich to tekst komunikatu proszącego o wprowadzenie danych, który zostanie wyświetlony u ytkowni- kowi, a drugi jest listą lub te odwołaniem do tablicy, które zawierać będą dopuszczalne odpowiedzi u ytkownika. U ytkownik mo e w ka dej chwili wcisnąć klawisze CTL+D, by wyświetlić listę dopuszczalnych odpowiedzi. Jeśli u ytkownik wprowadzi wystarczającą liczbę znaków, aby było mo liwe jednoznaczne zidentyfikowanie danego elementu listy, wciśnięcie klawisza TAB pozwoli uzupełnić resztę. Program update-category.pl pobierze listę bie ących kategorii (która przesłana zostanie procedurze %QORNGVG), korzystając z zapytania 5'.'%6, a następnie będzie modyfikować bazę za pomocą zapytania 72#6'. Oba zapytania zostaną połączone w jedną transakcję za po- mocą metody FDJ DGIKPAYQTM, podobnie jak to było w programie insert-category.pl. Lista kategorii pobierana jest z tabeli %CVGIQTKGU. Zamiast jednak umieszczać nazwy kate- gorii w tablicy, uczynimy je kluczami tablicy asocjacyjnej ECVGIQTKGU. Sprawdzenie, czy dany klucz istnieje w tablicy asocjacyjnej, zajmuje bowiem znacznie mniej czasu ni od- szukanie elementu w tablicy, tak więc program będzie dzięki temu działał szybciej. A oto jedna z mo liwych implementacji programu update-category.pl: WUTDKPRGTN PCYC RNKMW WRFCVGECVGIQT[RN WUG UVTKEV WUG YCTPKPIU WUG $+ WUG 6GTO%QORNGVG 2Q æE UKú DCæ FCP[EJ O[ WUGTPCOG TGWXGP O[ RCUUYQTF O[ FDJ $+ EQPPGEV $+2IFDPCOGEQTGRGTN WUGTPCOG RCUUYQTF ] #WVQ%QOOKV 4CKUG'TTQT _ ^^ FKG $ æF æEGPKC DCæ $+GTTUVT O[ ECVGIQTKGU 4QRQEPKL VTCPUCMELú MVÎTC DúFKG VTYC C FQ ECUW Y[YQ CPKC OGVQF[ FDJ EQOOKV NWD FDJ TQNNDCEM FDJ DGIKPAYQTM 2QDKGT PCY[ MCVGIQTKK K WE[ LG MNWECOK ECVGIQTKGU O[ USN 5'.'%6 ECVGIQT[APCOG HTQO %CVGIQTKGU O[ UVJ FDJ RTGRCTG USN UVJ GZGEWVG YJKNG O[ TQYTGH UVJ HGVEJTQYACTTC[TGH ] QFCL PQY[ MNWE FQ ECVGIQTKGU YCTVQ EKæ ECVGIQTKGU] TQYTGH=?_ _ CMQ E KPUVTWMELú UVJ HKPKUJ
  • 21. 296 Perl O[ QNFAECVGIQT[APCOG 2QDKGT KUVPKGLæEæ MCVGIQTKú W [YCLæE 6GTO%QORNGVG )F[ RTGTYKGO[ Vú RúVNú OKGPPC QNFAECVGIQT[APCOG DúFKG CYKGTCè PCYú KUVPKGLæEGL MCVGIQTKK WPVKN FGHKPGF ECVGIQTKGU] QNFAECVGIQT[APCOG_ ] QNFAECVGIQT[APCOG %QORNGVG 9RTQYCF PCYú KUVPKGLæEGL MCVGIQTKK MG[U ECVGIQTKGU _ 2QDKGT PQYæ PCYú MCVGIQTKK RTKPV OKG QNFAECVGIQT[APCOG PC O[ PGYAECVGIQT[APCOG EJQOR PGYAECVGIQT[APCOG 0CYC MCVGIQTKK OWUK CYKGTCè RT[PCLOPKGL LGFGP PCM KH PGYAECVGIQT[APCOG ` Y ] RTKPV $ æF 0CYC MCVGIQTKK OWUK CYKGTCè EQ PCLOPKGL LGFGP PCM P _ ,G NK PCY[ MCVGIQTKK Uæ 1- URTCYF E[ PKG OC LW LGL Y DCKG FCP[EJ GNUG ] 7UW PCY[ PKGRQVTGDPG URCELG PGYAECVGIQT[APCOG ` U@U I PGYAECVGIQT[APCOG ` UU I ,G NK PGYAECVGIQT[APCOG LGUV Y VCDGNK ECVGIQTKGU OWUKO[ RTGTYCè CD[ PCY[ UKú PKG RQYVCTC [ KH FGHKPGF ECVGIQTKGU] PGYAECVGIQT[APCOG_ ] CU[IPCNKWL D æF W [VMQYPKMQYK K Y[EQHCL VTCPUCMELú RTKPV $ æF -CVGIQTKC PGYAECVGIQT[APCOG LW KUVPKGLG Y DCKG FCP[EJ P FDJ TQNNDCEM FDJ FKUEQPPGEV GZKV _ 7VYÎT CR[VCPKG O[ USN 72#6' %CVGIQTKGU USN 5'6 ECVGIQT[APCOG ! USN 9*'4' ECVGIQT[APCOG ! 2T[IQVWL KPUVTWMELú O[ PWODGTAQHACHHGEVGFATQYU FDJ FQ USN WPFGH PGYAECVGIQT[APCOG QNFAECVGIQT[APCOG KH PWODGTAQHACHHGEVGFATQYU ] 4CRQTVWL Y[PKM W [VMQYPKMQYK K CVYKGTF VTCPUCMELú RTKPV OKGPK GO PCYú QNFAECVGIQT[APCOG PC PGYAECVGIQT[APCOG P FDJ EQOOKV _
  • 22. Rozdział 12. n Tworzenie aplikacji dla baz danych 297 GNUG ] 4CRQTVWL D æF W [VMQYPKMQYK K Y[EQHCL VTCPUCMELú RTKPV OKCPC PCY[ PKG QUVC C Y[MQPCPCP FDJ TQNNDCEM _ _ CMQ E RQ æEGPKG DCæ FCP[EJ FDJ FKUEQPPGEV 12.2.4. Dodawanie nowych ksią ek Po dodaniu kilku pozycji do tabel #WVJQTU, 2WDNKUJGTU i %CVGIQTKGU mo na przystąpić do wprowadzania do bazy danych księgarni nowych ksią ek. Dodanie nowej ksią ki oznacza konieczność wstawienia jednego wiersza do tabeli $QQMU i jednego lub więcej wierszy do tabeli $QQM#WVJQTU. Kolejny program, insert-book.pl, wykorzystuje większość technik, które opisywałem wcze- śniej w tym rozdziale: wykonuje zapytanie pobierające z bazy danych listę ju wprowadzo- nych wydawców i autorów, wykorzystuje moduł 6GTO%QORNGVG, dzięki któremu u ytkownik podaje odpowiednią nazwę wydawnictwa i nazwisko autora, i wreszcie wstawia wiersze do tabel $QQMU i $QQM#WVJQTU. Co więcej, przeprowadza to wszystko w ramach jednej transak- cji, dzięki czemu opisana sekwencja transakcji zostaje wykonana łącznie i niepowodzenie jednej oznaczać będzie niepowodzenie wszystkich. Warto równie zauwa yć, e korzystamy tutaj z właściwego tylko bazie PostgreSQL atry- butu RIAQKFAUVCVWU, który zwraca identyfikator (OID) ostatnio wstawionego obiektu. Identyfikatory obiektów są elementem specyficznym dla PostgreSQL. Mo na postrzegać je jako niewidoczny, globalny klucz główny ka dego wiersza w bazie danych. Identyfikator OID ostatnio wprowadzonego wiersza pozwala na pobranie klucza głównego dla ostatnio wykonanej operacji +05'46. Na koniec warto przyjrzeć się, w jaki sposób wiersze wstawiane są do tabeli $QQM#WVJQTU za pomocą pojedynczego odwołania do metody RTGRCTG i kilkakrotnego przywoływania metody GZGEWVG. W ten sposób odcią amy program Perla i przyśpieszamy znacznie wyko- nywanie zapytania, jeśli baza, z której korzystamy, przechowuje zapytania w pamięci pod- ręcznej. Program insert-book.pl jest jak dotąd najdłu szym programem związanym z bazami da- nych, które były omawiane w tej ksią ce. Poniewa jednak wszystkie jego elementy poja- wiały się ju w poprzednio prezentowanych programach, zrozumienie go nie powinno być zbyt trudne. WUTDKPRGTN PCYC RNKMW KPUGTVDQQMRN WUG UVTKEV WUG YCTPKPIU WUG $+
  • 23. 298 Perl WUG 6GTO%QORNGVG RTKPV 9KVCO[ Y RTQITCOKG 9UVCY MUKæ Mú PP 2Q æE UKú DCæ FCP[EJ O[ WUGTPCOG TGWXGP O[ RCUUYQTF O[ FDJ $+ EQPPGEV $+2IFDPCOGEQTGRGTN WUGTPCOG RCUUYQTF ] #WVQ%QOOKV 4CKUG'TTQT _ ^^ FKG $ æF æEGPKC DCæ $+GTTUVT FGHKPKWL RCTú EúUVQ W [YCP[EJ OKGPP[EJ O[ USN UVJ CEPKL PQYæ VTCPUCMELú MVÎTæ CMQ E[ Y[YQ CPKG FDJ EQOOKV NWD FDJ TQNNDCEM FDJ DGIKPAYQTM 2QDKGT CWVQTÎY K WE[ KEJ MNWECOK VCDNKE[ CUQELCE[LPGL O[ CWVJQTU USN 5'.'%6 CWVJQTAPCOG CWVJQTAKF USN (41/ #WVJQTU 2T[IQVWL KPUVTWMELú UVJ FDJ RTGRCTG USN 9[MQPCL KPUVTWMELú UVJ GZGEWVG YJKNG O[ TQYTGH UVJ HGVEJTQYACTTC[TGH ] O[ CWVJQTAPCOG CWVJQTAKF ] TQYTGH_ CWVJQTU] CWVJQTAPCOG_ CWVJQTAKF _ 2QDKGT Y[FCYEÎY K WE[ KEJ MNWECOK VCDNKE[ CUQELCE[LPGL O[ RWDNKUJGTU USN 5'.'%6 RWDNKUJGTAPCOG RWDNKUJGTAKF USN (41/ 2WDNKUJGTU 2T[IQVWL KPUVTWMELú UVJ FDJ RTGRCTG USN 9[MQPCL KPUVTWMELú UVJ GZGEWVG YJKNG O[ TQYTGH UVJ HGVEJTQYACTTC[TGH ] O[ RWDNKUJGTAPCOG RWDNKUJGTAKF ] TQYTGH_ RWDNKUJGTU] RWDNKUJGTAPCOG_ RWDNKUJGTAKF _
  • 24. Rozdział 12. n Tworzenie aplikacji dla baz danych 299 2QDKGT KPHQTOCELú QF W [VMQYPKMC O[ KUDP IGVAKPHQ +5$0 O[ VKVNG IGVAKPHQ V[VW 2QDKGT YKGNW CWVQTÎY O[ CWVJQTU YJKNG O[ CWVJQT IGVAKPHQ CWVQTC MG[U CWVJQTU ] NCUV WPNGUU CWVJQT RWUJ CWVJQTU CWVJQT _ O[ RWDNKUJGT IGVAKPHQ Y[FCYEú MG[U RWDNKUJGTU O[ RCIGU IGVAKPHQ NKEDú UVTQP O[ RWDAFCVG IGVAKPHQ FCVú Y[FCPKC ;;;;// O[ WUAFQNNCTARTKEG IGVAKPHQ EGPú Y FQNCTCEJ 9UVCY FQ DC[ PQYæ MUKæ Mú USN +05'46 +061 $QQMU USN KUDP VKVNG RWDNKUJGTAKF PWOARCIGU USN RWDAFCVG WUAFQNNCTARTKEG USN 8#.7'5 ! ! ! ! ! ! UVJ FDJ RTGRCTG USN UVJ GZGEWVG KUDP VKVNG RWDNKUJGTU] RWDNKUJGT_ RCIGU RWDAFCVG WUAFQNNCTARTKEG O[ PGYADQQMAQKF UVJ ]RIAQKFAUVCVWU_ UVJ HKPKUJ 7 [L KFGPV[HKMCVQTC 1+ PQYGL MUKæ MK FQ RQDTCPKC DQQMAKF USN 5'.'%6 DQQMAKF USN (41/ $QQMU USN 9*'4' QKF ! 2T[IQVWL KPUVTWMELú UVJ FDJ RTGRCTG USN 9[MQPCL KPUVTWMELú UVJ GZGEWVG PGYADQQMAQKF 2QDKGT DQQMAKF YKGTUC Q KFGPV[HKMCVQTG 1+ O[ PGYADQQMAKF UVJ HGVEJTQYACTTC[ UVJ HKPKUJ 9UVCY RQYKæCPKG MUKæ MK CWVQTGO USN +05'46 +061 $QQM#WVJQTU DQQMAKF CWVJQTAKF 8#.7'5 ! ! UVJ FDJ RTGRCTG USN
  • 25. 300 Perl HQTGCEJ O[ CWVJQT CWVJQTU ] UVJ GZGEWVG PGYADQQMAKF CWVJQTU] CWVJQT_ RTKPV )QVQYGP _ +PUVTWMELC CMQ EQPC UVJ HKPKUJ ,G NK YU[UVMQ RQU Q FQDTG CVYKGTFCO[ VTCPUCMELú FDJ EQOOKV CO[MCO[ RQ æEGPKG DCæ FCP[EJ FDJ FKUEQPPGEV 2TQEGFWTC RQDKGTCLæEC KPHQTOCELG QF W [VMQYPKMC UWD IGVAKPHQ ] O[ SWGUVKQP UJKHV O[ EQORNGVKQPU A O[ EQORNGVKQPUAJCUJ OCR ] A _ EQORNGVKQPU O[ KPRWV 7 [YCO[ 6GTO%QORNGVG LG NK VTGDC WWRG PKè FCPG KH EQORNGVKQPU ] KPRWV %QORNGVG 2QFCL SWGUVKQP MUKæ MK MG[U EQORNGVKQPUAJCUJ _ ,G NK PKG OC VCMKGL RQVTGD[ TQRQE[PCO[ UVCPFCTFQYQ GNUG ] RTKPV 2QFCL SWGUVKQP MUKæ MK KPRWV 2QDKGT FCPG QF W [VMQYPKMC EJQOR KPRWV 7UW MQ EC PCM PQYGIQ YKGTUC KPRWV ` U@U I 7UW URCELG RQEæVMW KPRWV ` UU I 7UW URCELG MQ EC _ TGVWTP KPRWV _ Mimo i program insert-book.pl nie obsługuje kategorii, nietrudno domyślić się, jak powi- nien wyglądać odpowiedni kod, który nale ałoby w tym celu dodać do programu. 12.2.5. Pobieranie informacji o ksią kach Teraz, gdy baza danych księgarni jest gotowa, pora przygotować prostą aplikację wykonu- jącą zapytania, które umo liwią u ytkownikom zdobycie informacji na temat konkretnych ksią ek. Napiszemy przykładowy program, który będzie zwracał ksią ki o tytułach zawie- rających tekst wprowadzony przez u ytkownika.
  • 26. Rozdział 12. n Tworzenie aplikacji dla baz danych 301 Warto zauwa yć, e najpierw wczytujemy wszystkie informacje o ksią ce do tablicy aso- cjacyjnej DQQM, a dopiero później je wyświetlamy. Dzieje się tak, poniewa baza Postgre- SQL zwróci po jednym wierszu dla ka dego autora ksią ki. Gdybyśmy po prostu wyświe- tlili wyniki, tak jak są one zwracane przez bazę danych, ksią ki mające dwóch autorów byłyby wyświetlane dwukrotnie, a ksią ki mające pięciu autorów — a pięć razy! Unik- niemy takich powtórzeń, wczytując wszystkie zwrócone ksią ki do tablicy asocjacyjnej ta- blic asocjacyjnych, którą następnie posortujemy i wyświetlimy to, co nam pozostanie. Porządek, w jakim będą zwracane wyniki, mo e wydawać się nieistotny, skoro i tak zostaną one uporządkowane w pętli HQTGCEJ. Nie jest to jednak do końca prawda: autorzy są doda- wani do tablicy asocjacyjnej DQQM w takim samym porządku, w jakim są pobierani. Dlatego właśnie klauzula 14'4 $; upewnia się, e zwracane wiersze będą uporządkowane według nazwisk autorów. Aby uniknąć pomyłek, które mogą być spowodowane ró nicami w wielkości liter, wyko- rzystywana jest funkcja .19'4 języka SQL, która powoduje zamianę wszystkich wielkich znaków ciągów, które są jej argumentami, na małe: WUTDKPRGTN PCYC RNKMW SWGT[VKVNGRN WUG UVTKEV WUG YCTPKPIU WUG $+ RTKPV SS]9KVCO[ Y RTQITCOKG CR[VCPKC PP_ 2Q æE UKú DCæ FCP[EJ O[ WUGTPCOG TGWXGP O[ RCUUYQTF O[ FDJ $+ EQPPGEV $+2IFDPCOGEQTGRGTN WUGTPCOG RCUUYQTF ] #WVQ%QOOKV 4CKUG'TTQT _ ^^ FKG $ æF æEGPKC DCæ $+GTTUVT 2QDKGT V[VW QF W [VMQYPKMC RTKPV 2QFCL RQUWMKYCP[ PCRKU O[ VCTIGV EJQOR VCTIGV 9G Y EWF[U ÎY OGVCPCMK 53. VCTIGV ` U^ ^ ^I VCTIGV ` U^A^A^I 2TGMUVC è C EWEJ Y Y[TC GPKG TGIWNCTPG 53. VCTIGV VCTIGV 7VYÎT CR[VCPKG O[ USN 5'.'%6 $KUDP $VKVNG 2RWDNKUJGTAPCOG $PWOARCIGU USN $RWDAFCVG $WUAFQNNCTARTKEG #CWVJQTAPCOG USN (41/ $QQMU $ 2WDNKUJGTU 2 #WVJQTU # $QQM#WVJQTU $# USN 9*'4' .19'4 $VKVNG .+-' .19'4 ! USN #0 $#CWVJQTAKF #CWVJQTAKF USN #0 $DQQMAKF $#DQQMAKF USN #0 $RWDNKUJGTAKF 2RWDNKUJGTAKF USN 14'4 $; #CWVJQTAPCOG
  • 27. 302 Perl 2T[IQVWL KPUVTWMELú O[ UVJ FDJ RTGRCTG USN 9[MQPCL KPUVTWMELú O[ UWEEGUU UVJ GZGEWVG VCTIGV KH UWEEGUU ] O[ DQQM YJKNG O[ TQYTGH UVJ HGVEJTQYACTTC[TGH ] O[ KUDP VKVNG RWDNKUJGT RCIGU FCVG RTKEG CWVJQT TQYTGH CEJQYCL KPHQTOCELú Q MUKæ EG Y DQQM DQQM] KUDP_ ]VKVNG_ VKVNG DQQM] KUDP_ ]RWDNKUJGT_ RWDNKUJGT DQQM] KUDP_ ]RCIGU_ RCIGU DQQM] KUDP_ ]FCVG_ FCVG DQQM] KUDP_ ]RTKEG_ RTKEG CLOKL UKú CWVQTCOK KH DQQM] KUDP_ ]CWVJQT_ ] DQQM] KUDP_ ]CWVJQT_ CWVJQT _ GNUG ] DQQM] KUDP_ ]CWVJQT_ CWVJQT _ _ 2TGLT[L MUKæ MK Y RúVNK K Y[ YKGVN KPHQTOCELG Q PKEJ HQTGCEJ O[ KUDP UQTV ] DQQM] C_ ]VKVNG_ EOR DQQM] D_ ]VKVNG__ MG[U DQQM ] RTKPV P RTKPV DQQM] KUDP_ ]VKVNG_P RTKPV Z NGPIVJ DQQM] KUDP_ ]VKVNG_ P RTKPV #WVQT DQQM] KUDP_ ]CWVJQT_P RTKPV +5$0 KUDPV9[FCYEC DQQM] KUDP_ ]RWDNKUJGT_P RTKPV CVC Y[FCPKC DQQM] KUDP_ ]FCVG_V RTKPV %GPC DQQM] KUDP_ ]RTKEG_P RTKPV .KEDC UVTQP DQQM] KUDP_ ]RCIGU_P _ KH UVJ TQYU ] RTKPV $TCM MUKæ GM RCUWLæE[EJ FQ YQTECP _ _ GNUG ] RTKPV $ æF RT[IQVQYCPKC CR[VCPKC $+GTTUVT _ UVJ HKPKUJ FDJ FKUEQPPGEV
  • 28. Rozdział 12. n Tworzenie aplikacji dla baz danych 303 12.3. Usuwanie błędów w programach korzystających z DBI Perl jest językiem programowania, w którym błędy wykrywa się bardzo łatwo. Wielu pro- gramistów zamiast korzystać z wbudowanego debuggera (patrz: sekcja 13.4.2), po prostu wstawia do kodu kilka instrukcji RTKPV. Tego rodzaju techniki nie zawsze jednak wystar- czają, gdy korzystamy z interfejsu $+. Jeśli na przykład program zakończy pracę w wyniku błędu bazy danych po próbie wykona- nia instrukcji +05'46 wstawiającej wiersz do bazy danych $QQM#WVJQTU, dobrze by było wie- dzieć, jak dokładnie wyglądało ostateczne zapytanie SQL, zanim zostało wysłane do bazy danych. Jeśli korzystamy w zapytaniu z symboli zastępczych, oka e się, e uzyskanie tego rodzaju informacji jest bardzo trudne. Rozwiązaniem jest metoda FDJ VTCEG , która pomaga w usuwaniu błędów z programów korzystających z interfejsu $+. Wymaga ona jednego obowiązkowego argumentu, który powinien być liczbą całkowitą z przedziału od 0 (zupełny brak wykrywania błędów) do 9 (poziom wykrywania błędów oferujący znacznie więcej informacji ni prawdopodobnie kiedykolwiek będziesz potrzebować). Drugi argument jest opcjonalny i podaje nazwę pliku na dysku, do którego mają być zapisywane informacje debugowania. Domyślnie wszystkie informacje dostarczane przez metodę FDJ VTCEG trafiają do standardowego strumienia błędów 56'44. Po aktywacji metoda FDJ VTCEG działać będzie przez cały czas pracy programu lub do momentu, gdy zostanie wyłączona. Bardzo często metodę FDJVTCEG wykorzystuje się w trakcie tworzenia programu, by wyłączyć ją, kiedy program zaczyna normalne działanie. Mo na równie wywołać metodę VTCEG jako metodę klasy wprost z modułu $+, wpisując $+ VTCEG . Pozwoli to na śledzenie działania metody $+ EQPPGEV , która zwraca uchwyt bazy danych FDJ. eby pokazać, jakie informacje zwraca metoda FDJ VTCEG , zaprezentuję tutaj zapis działania programu insert-book.pl, dla którego metoda FDJ VTCEG została włączona na pierwszym poziomie debugowania. Do kodu programu insert-book.pl dodałem tylko jeden wiersz, zaraz po odwołaniu do metody $+ EQPPGEV : FDJ VTCEG VORKPUGTVDQQMVTCEGVZV Oto, co pojawiło się na ekranie podczas działania programu insert-book.pl: 2QFCL +5$0 MUKæ MK 2QFCL V[VW MUKæ MK + NKMG 2GTN 2QFCL CWVQTC MUKæ MK 4GWXGP / .GTPGT 2QFCL CWVQTC MUKæ MK 2QFCL Y[FCYEú MUKæ MK 2TGPVKEG*CNN 2QFCL NKEDú UVTQP MUKæ MK 2QFCL FCVú Y[FCPKC ;;;;// MUKæ MK 2QFCL EGPú Y FQNCTCEJ MUKæ MK )QVQYG
  • 29. 304 Perl W tym czasie za kulisami moduł $+ zebrał następujące informacje o tej sesji: $+FD*#5* ZHE VTCEG NGXGN UGV VQ KP $+ PQVJTGCF FDFAFDA('6%* ('6%* CV $+RO NKPG FDFAFDA5614' 5614' #WVQ%QOOKV CV $+RO NKPG FDFAFDA5614' 5614' $GIWP9QTM CV $+RO NKPG DGIKPAYQTM CV KPUGTVDQQMRN NKPG FDFAUVARTGRCTG UVCVGOGPV 5'.'%6 CWVJQTAPCOG CWVJQTAKF (41/ #WVJQTU FDFAUVARTGRCTUG UVCVGOGPV 5'.'%6 CWVJQTAPCOG CWVJQTAKF (41/ #WVJQTU RTGRCTG 5'.'%6 CWVJQTAPCOG CWVJQTAKF (41/ #WVJQTU %1' $+UV*#5* Z CV KPUGTVDQQMRN NKPG FDFAUVAGZGEWVG GZGEWVG %1' CV KPUGTVDQQMRN NKPG FDFAUVAHGVEJ HGVEJTQYACTTC[TGH = (QQ $CT ? TQY CV KPUGTVDQQMRN NKPG FDFAUVAHGVEJ FDFAUVAHGVEJ HGEVJTQYACTTC[TGH WPFGH TQY CV KPUGTVDQQMRN NKPG FDFAUVARTGRCTG UVCVGOGPV 5'.'%6 RWDNKUJGTAPCOG RWDNKUJGTAKF (41/ 2WDNKUJGTU FDFAUVARTGRCTUG UVCVGOGPV 5'.'%6 RWDNKUJGTAPCOG RWDNKUJGTAKF (41/ 2WDNKUJGTU RTGRCTG 5'.'%6 RWDNKUJGTAPCOG RWDNKUJGTAKF (41/ 2WDNKUJGTU %1' $+UV*#5* ZFE CV KPUGTVDQQMRN NKPG FDFAUVAFGUVTQ[ '5641; WPFGH CV KPUGTVDQQMRN NKPG FDFAUVAGZGEWVG GZGEWVG %1' CV KPUGTVDQQMRN NKPG FDFAUVAHGVEJ HGVEJTQYACTTC[TGH = 2TGPVKEG*CNN ? TQY CV KPUGTVDQQMRN NKPG FDFAUVAHGVEJ FDFAUVAHGVEJ FDFAUVAHGVEJ HGVEJTQYACTTC[TGH WPFGH TQY CV KPUGTVDQQMRN NKPG FDFAUVARTGRCTG UVCVGOGPV +05'46 +061 $QQMU KUDP VKVNG RWDNKUJGTAKF PWOARCIGU RWDAFCVG WUAFQNNCTARTKEG 8#.7'5 ! ! ! ! ! ! FDFAUVARTGRCTUG UVCVGOGPV +05'46 +061 $QQMU KUDP VKVNG RWDNKUJGTAKF PWOARCIGU RWDAFCVG WUAFQNNCTARTKEG 8#.7'5 ! ! ! ! ! ! RTGRCTG +05'46 +061 $QQMU KUDP VKVNG RWDNKUJGTAKF PWOARCIGU RWDAFCVG WUAFQNNCTARTKEG 8#.7'5 ! ! ! ! ! ! %1' $+UV*#5* ZHG CV KPUGTVDQQMRN NKPG FDFAUVAFGUVTQ[ '5641; WPFGH CV KPUGTVDQQMRN NKPG FDFADKPFARJ FDFAUVATGDKPF FDFADKPFARJ FDFAUVATGDKPF FDFADKPFARJ FDFAUVATGDKPF FDFADKPFARJ FDFAUVATGDKPF
  • 30. Rozdział 12. n Tworzenie aplikacji dla baz danych 305 FDFADKPFARJ FDFAUVATGDKPF FDFADKPFARJ FDFAUVATGDKPF FDFAUVAGZGEWVG GZGEWVG + NKMG 2GTN CV KPUGTVDQQMRN NKPG FDFAUVA('6%* ('6%* CV KPUGTVDQQMRN NKPG HKPKUJ CV KPUGTVDQQMRN NKPG FDFAUVARTGRCTG UVCVGOGPV 5'.'%6 DQQMAKF (41/ $QQMU 9*'4' QKF ! FDFAUVARTGRCTUG UVCVGOGPV 5'.'%6 DQQMAKF (41/ $QQMU 9*'4' QKF ! RTGRCTG 5'.'%6 DQQMAKF (41/ $QQMU 9*'4' QKF ! %1' $+UV*#5* ZF CV KPUGTVDQQMRN NKPG FDFAUVAFGUVTQ[ '5641; WPFGH CV KPUGTVDQQMRN NKPG FDFADKPFARJ FDFAUVATGDKPF FDFAUVAGZGEWVG GZGEWVG %1' CV KPUGTVDQQMRN NKPG FDFAUVAHGVEJ HGVEJTQYACTTC[ = KVGOU? TQY CV KPUGTVDQQMRN NKPG FDFAUVAHKPKUJ HKPKUJ CV KPUGTVDQQMRN NKPG FDFAUVARTGRCTG UVCVGOGPV +05'46 +061 $QQM#WVJQTU DQQMAKF CWVJQTAKF 8#.7'5 ! ! FDFAUVARTGRCTUG UVCVOGPV +05'46 +061 $QQM#WVJQTU DQQMAKF CWVJQTAKF 8#.7'5 ! ! RTGRCTG +05'46 +061 $QQM#WVJQTU DQQMAKF CWVJQTAKF 8#.7'5 ! ! %1' $+UV*#5* ZG CV KPUGTVDQQMRN NKPG FDFAUVAFGUVTQ[ '5641; WPFGH CV KPUGTVDQQMRN NKPG FDFADKPFARJ FDFAUVATGDKPF FDFADKPFARJ FDFAUVATGDKPF FDFAUVAGZGEWVG GZGEWVG CV KPUGTVDQQMRN NKPG HKPKUJ CV KPUGTVDQQMRN NKPG FDFAFDAEQOOKV EQOOKV CV KPUGTVDQQMRN NKPG FDFAFDA5614' 5614' #WVQEQOOKV CV KPUGTVDQQMRN NKPG FDFAFDAFKUEQPPGEV FKUEQPPGEV CV KPUGTVDQQMRN NKPG FDFAUVAFGUVTQ[ '5641; WPFGH FDFAUVAFGUVTQ[ '5641; WPFGH Jak widać, metoda FDJ VTCEG dostarcza kompletnego dziennika rejestrującego ka dą zmianę atrybutu oraz ka dą wywołaną metodę RTGRCTG, GZGEWVG lub FDJ EQOOKV .
  • 31. 306 Perl 12.4. Podsumowanie W tym rozdziale poszerzyliśmy wiedzę na temat teorii baz danych. Poznaliśmy równie kilka standardowych rozwiązań z zakresu projektowania baz danych, które niezmiernie uła- twiają tworzenie prawdziwych aplikacji współpracujących z bazami. Przyjrzeliśmy się do- kładnie przykładowym programom obsługującym katalog ksią ek oferowanych przez pewną księgarnię. W szczególności omawialiśmy: n znaczenie normalizacji danych, która czyni bazy danych wydajniejszymi i łatwiejszymi w obsłudze, n sposoby projektowania bazy danych, tak by była jak najwszechstronniejsza i pozostawała wydajna, niezale nie od tego, ile informacji będzie przechowywać, n wykorzystanie modułu 6GTO%QORNGVG do narzucania ograniczeń na dane wprowadzane przez u ytkownika, n korzystanie z metody FDJ VTCEG ułatwiającej wyszukiwanie błędów w aplikacjach dla baz danych.