Na zakończenie musimy sobie powiedzieć o jeszcze jednej ważnej rzeczy. Twój skrypt może zapisywać i odczytywać pliki tekstowe. Jest to bardzo użyteczna możliwość i wykorzystaliśmy ją już w projekcie z poprzedniej części. Poza tym operacje na plikach w TCL są bardzo proste.
Na początku trzeba otworzyć plik. Służy do tego polecenie:
Otwarcie pliku:
open <nazwa-pliku> <rodzaj-dostępu>
Jako nazwę pliku musisz podać łańcuch składający się z opcjonalnej ścieżki oraz nazwy i rozszerzenia pliku. Ścieżka może być względna i liczona jest od katalogu głównego Eggdropa.
Rodzaj dostępu określa możliwość odczytu i zapisu, pozycję kursora w pliku zaraz po otwarciu oraz zachowanie skryptu w sytuacji, jeśli podany plik nie istnieje. Możliwe rodzaje dostępu:
rr+ww+aPolecenie to zwraca uchwyt do otwartego pliku, zwany w dokumentacji TCL kanałem (ang. "channel").
Otwarty plik obowiązkowo trzeba zamknąć. Służy do tego polecenie:
Zamknięcie pliku:
close <uchwyt>
Do zapisania wiersza tekstu do pliku służy polecenie:
Zapisywanie:
puts <uchwyt> <tekst>
Do odczytania wiersza tekstu z pliku służy zwracające odczytany tekst polecenie:
Odczytywanie:
gets <uchwyt>
Istnieje też funkcja, która odczytuje i zwraca całą zawartość pliku:
Odczytywanie całego pliku:
read <uchwyt>
Do sprawdzenia, czy podczas odczytywania kursor osiągnął koniec pliku służy zwracające wartość logiczną 1 lub 0 polecenie:
Sprawdzanie końca pliku:
eof <uchwyt>
Przed otwarciem pliku tylko do odczytu warto sprawdzić, czy plik istnieje, by uniknąć ewentualnego błędu:
Sprawdzanie, czy plik istnieje:
file exists <nazwa-pliku>
Polecenie file posiada dużo więcej możliwości związanych z operacjami
na podanym pliku, jak np. zmiana atrybutów, czy odczytywanie rozmiaru.
Po szczegóły odsyłam do opisu tego polecenia w dokumentacji TCL.
Istnieje też szereg innych poleceń, które pozwalają zarządzać plikami. np.:
globseektellcompressfileuncompressfileiscompressedOpisałem tylko te polecenia, które znam i których sam używam. Możliwości, w jakie wyposażony został język TCL i jego rozszerzenie w Eggdrop, jest dużo dużo więcej. Warto wspomnieć m.in. o:
binaryddeencodingerrorformatsprintf z języka C++ czy
Format z Delphi.
httpregistrytraceupvarglobal czy variable,
ponieważ pozwala na przekazywanie do procedur czegoś w rodzaju referencjiencryptdecryptencpass...a także wiele innych poleceń, szczególnie dużo związanych z samym interpreterem TCL.
W dokumencie "Eggdrop TCL Commands" znajdziesz też wiele poleceń związanych z IRCem i samym Eggdropem, m.in. do manipulacji kontami zajegestrowanych użytkowników bota, do DCC i notatek (ang. "notes").
Także poleceń, które omawialiśmy, nie opisałem w sposób wyczerpujący. W oryginalnej dokumentacji znajdziesz dużo więcej różnych przełączników i opcjonalnych parametrów do prawie każdego z nich.
Mówiliśmy swego czasu o maskach, czyli dopasowywanych do różnych innych łańcuchów łańcuchach, które mogą zawierać tzw. znaki zastępcze (ang. "wildcards"). Ich zastosowanie w TCL jest dużo szersze, niż tylko podczas bindowania zdarzeń.
Oprócz masek istnieje jednak dużo potężniejszy mechanizm. Są nim wyrażenia regularne (ang. "regular expressions", w skrócie "regexps"). Ich opis znajdziesz w dokumentacji języka TCL pod hasłem "re_syntax".
Wiele poleceń (jak np. switch) potrafi przypasowywać łańcuchy zarówno do masek,
jak i do wyrażeń regularnych, zależnie od wpisanych przełączników.
Trudno pisze się wstępniaki, ale zakończenia jeszcze trudniej. Właściwie nie wiem, co powinienem tu napisać...
Chciałem, aby ten kurs stanowił dobre wprowadzenie dla każdego, kto lubi IRC, potrafi postawić bota i chce pisać rozszerzenia do niego w postaci skryptów TCL. Najbardziej cieszyłbym się, gdyby ktoś przeczytawszy cały ten dokument poznał i polubił TCL oraz zaczął pisać własne ciekawe skrypty. Niezależnie, czy będzie to doświadczony w normalnych kompilowanych językach programista, czy też ktoś, kto dopiero z tego kursu dowie się, czym jest zmienna i pętla.
Można powiedzieć, że znasz już język TCL. Jeśli miałbyś wątpliwości to zapewniam cię, że jesteś gotów do pisania całkiem dużych i poważnych skryptów. Oczywiście - masz rację - nie jest to łatwe. Sam język TCL do skomplikowanych nie należy, ale jego natura (szczególnie brak możliwości programowania zorientowanego obiektowo) może niektórym przeszkadzać.
Jednakże jeśli oprócz dokładnego przeczytania tego kursu i jakiegoś doświadczenia praktycznego będziesz często sięgał do oryginalnej dokumentacji oraz przede wszystkim będziesz miał zapał do programowania, jakieś cele do zrealizowania i zachowasz motywację, możesz już teraz zdziałać naprawdę dużo.
Projektem kończącym kurs będzie zadanie najtrudniejsze, ale i najciekawsze. Podczas nauki TCL z pewnością przyszedł ci do głowy niejeden pomysł na ciekawy skrypt. Aby zainspirować cię do dalszego poszukiwania pomysłów, zaproponuję kilka moich, tych najbardziej odjechanych, na jakie wpadłem:
Twoim zadaniem jest napisać taki skrypt, o jakim marzysz najbardziej!
Adam Sawicki