Systemy operacyjne. Laboratorium 8. Perl find

Podobne dokumenty
Systemy operacyjne. Laboratorium 9. Perl wyrażenia regularne. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

Systemy operacyjne. Laboratorium 3. Find. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

Systemy operacyjne. Laboratorium 7. Perl podstawy. Jarosław Rudy Politechnika Wrocławska 27 kwietnia 2017

Programowanie 2. Perl - Tablice asocjacyjne oraz funkcje tablicowe. Marcin Junczys-Dowmunt

Systemy operacyjne. Laboratorium 2. Dowiązania. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Dzisiejszy wykład. Programowanie w Perlu. Co to jest hasz? Inicjalizacja haszów

Słowem wstępu. Część rodziny języków XSL. Standard: W3C XSLT razem XPath 1.0 XSLT Trwają prace nad XSLT 3.0

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Wykład 8: klasy cz. 4

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

1. Wprowadzenie do języka PHP

1. Wyrażenia regularne. Symbole w wyrażeniach regularnych 1 :

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Oczywiście plik musi mieć rozszerzenie *.php

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Trochę o plikach wsadowych (Windows)

Wstęp do programowania

Języki programowania zasady ich tworzenia

Lab 9 Podstawy Programowania

Języki formalne i automaty Ćwiczenia 6

Metody Kompilacji Wykład 3

Autor: Joanna Karwowska

Drzewa poszukiwań binarnych

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

PARADYGMATY PROGRAMOWANIA Wykład 4

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

XML i nowoczesne technologie zarządzania treścią 2007/08

7. Pętle for. Przykłady

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Podstawy Pythona. Krzysztof Gdawiec. Instytut Informatyki Uniwersytet Śląski

Argumenty wywołania programu, operacje na plikach

- wszystkie elementy - wszystkie elementy

KARTA KURSU. Języki skryptowe

Ćwiczenie 1. Wprowadzenie do programu Octave

Język C, tablice i funkcje (laboratorium, EE1-DI)

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Język C++ zajęcia nr 2

Systemy operacyjne. Laboratorium 5. Awk podstawy. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

PHP: bloki kodu, tablice, obiekty i formularze

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych

Programowanie w języku Python. Grażyna Koba

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Przykład 1: Funkcja jest obiektem, przypisanie funkcji o nazwie function() do zmiennej o nazwie funkcja1

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Rozdział 4 KLASY, OBIEKTY, METODY

Podstawy JavaScript ćwiczenia

Backend Administratora

4. Funkcje. Przykłady

Podstawy Rejestru systemu. Poddrzewa

Projektowanie układów na schemacie

Pakiety i interfejsy. Tomasz Borzyszkowski

Wskaźniki. Informatyka

Użytkownicy I. Użytkownik. Głównym celem istnienia użytkowników i grup w systemie jest utrzymanie porządku i separacja uprawnień.

5.1. MINIPOS MINIPOS. INSTALACJA ORAZ URUCHOMIENIE USŁUGI

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

Pliki. Operacje na plikach w Pascalu

Dlaczego GML? Gdańsk r. Karol Stachura

Wykład 5: Klasy cz. 3

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

1 Przygotował: mgr inż. Maciej Lasota

Znaki globalne w Linuxie

Serwer WWW Apache. Plik konfiguracyjny httpd.conf Definiujemy m.in.: Aktualne wersje 2.4.6, , zakończony projekt

Programowanie obiektowe i C++ dla matematyków

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Makropolecenia w PowerPoint Spis treści

Zacznijmy więc pracę z repozytorium. Pierwsza konieczna rzecz do rozpoczęcia pracy z repozytorium, to zalogowanie się w serwisie:

W dowolnym momencie można zmienić typ wskaźnika.

Ćwiczenie 1. Wprowadzenie do programu Octave

Porządek symetryczny: right(x)

< K (2) = ( Adams, John ), P (2) = adres bloku 2 > < K (1) = ( Aaron, Ed ), P (1) = adres bloku 1 >

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

etrader Pekao Podręcznik użytkownika Strumieniowanie Excel

Zapis algorytmów: schematy blokowe i pseudokod 1

Podstawy technologii WWW

ang. file) Pojęcie pliku (ang( Typy plików Atrybuty pliku Fragmentacja wewnętrzna w systemie plików Struktura pliku

Sieciowa instalacja Sekafi 3 SQL

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Funkcje i Procedury. Wyrazenien

Informatyka I: Instrukcja 4.2

Make jest programem komputerowym automatyzującym proces kompilacji programów, na które składa się wiele zależnych od siebie plików.

Programowanie hybrydowe C (C++) - assembler. MS Visual Studio Inline Assembler

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Pracownia Komputerowa wykład III

Lekcja 10. Uprawnienia. Dołączanie plików przy pomocy funkcji include() Sprawdzanie, czy plik istnieje przy pmocy funkcji file_exists()

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Perl a XML. Narzędzia informatyczne w językoznawstwie. Generowanie danych XML - Przykład. Generowanie danych XML. Perl - Przetwarzanie XML

Przekazywanie argumentów wskaźniki

Spis treści. Funkcje. 1 Funkcje 1.1 Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie 7

Kontenery i iteratory. Wykorzystanie kontenerów w praktyce.

Zawartość. Wstęp. Moduł Rozbiórki. Wstęp Instalacja Konfiguracja Uruchomienie i praca z raportem... 6

Wstęp do Informatyki dla bioinformatyków

Transkrypt:

Systemy operacyjne Laboratorium 8 Perl find Temat obejmuje przeszukiwanie drzew katalogowych z użyciem perla oraz podstawowe zdolności w używaniu referencji, tablic asocjacyjnych i mechanizmów typu stat. 1 Wstęp Perlowe przeszukiwanie drzew katalogów na podobieństwo komendy find odybwa się z wykorzystaniem modułu File::Find, który należy dołączyć w początkowej części skryptu: use File::Find; Samo przeszukiwanie zaczyna się od wywołania jednej z dwóch funkcji: find lub finddepth. Wbrew nazwie obie funkcją przeszukują drzewo metodą wgłąb. Tzn. dla poniższego drzewa: A / \ B E / \ / \ C D F G całe poddrzewo B zostanie przetworzone przed poddrzewem E albo odwrotnie. Różnica pomiędzy find i finddepth polega na tym, że pierwsze przetwarza katalog przed jego zawartością, zaś finddepth po jego zawartości. Pierwszy da więc kolejność np.: A B C D E F G zaś drugie może dać kolejność: C D B F G E A żadne jednak nie da kolejności: ani A B E C D F G 1

C D F G B E A które były by typowe dla poszukiwania wszerz. Samo użycie funkcji find (lub finddepth) ma następującą bazową składnię: find( \&funkcja przetwarzania, @katalogi ); Drugi argument, @katalogi, określa które katalogi należy przetworzuć. Może to być pojedynczy katalog (skalar lub tablica jednoelementowa) lub wiele katalogów (tablica wieloelementowa). Argument pierwszy określa z kolei nazwę funkcji, jaką należy wywołać dla każdego przetwarzanego elementu (z pewnymi wyjątkami). Sam zapis \& oznacza kontekst referencji kodu i jest niejako odpowiednikiem wskaźnika na funkcję z języka C/C++. Aby kod mógł zadziałać, należy w programie zdefiniować samą funkcję w postaci: sub funkcja przetwarzania() { (ciało funkcji) } Oczywiście, czy użyjemy nazwy funkcja przetwarzania, wanted czy dowolnej innej nie jest istotne. Powyższe wywołanie find wystarczy do podstawowych zastosowań, ale istnieje dodatkowa forma wywołania: find( %options, @directories ); gdzie %options jest pewnym haszem, który definiuje parametry potrzebne funkcji find. 2 Hasze Hasze w perlu są realizacją tablic asocjacyjnych (map, słowników) przechowujących dane na zasadzie klucz-wartość. W perlu mamy więc natywnie dostęp do zwykłych tablic (kontekst @) oraz do tablic asocjacyjnych (kontekst %). Poniżej pokażemy podstawową składnię związaną z tworzeniem i wykorzystaniem haszy. Definicja hasza wygląda następująco: lub %hash = ( 'klucz1', 'wartosc1', 'klucz2', 'wartosc2' ); %hash = ( 'klucz1' => 'wartosc1', 'klucz2' => 'wartosc2' ); Oczywiście możemy użyć cudzysłowów zamiast apostrofów lub podać wartości z użyciem zmiennych: %hash = ( $zmienna => 'wartosc'' ); 2

Warto zwrócić uwagę na fakt, że nawiasy w tej formie są nawiasami okrągłymi. Możemy również dodać (lub nadpisać) wartość dla danego klucza w istniejącym haszu: $hash{ 'klucz' } = 'wartosc'; Zauważmy, że w tym przypadku a) odwołujemy się do pojedynczego klucza, więc używamy dolara zamiast procenta oraz b) stosujemy nawiasy klamrowe. Funkcja (operator) keys pozwala w łatwy sposób uzyskać dostęp do wszystkich kluczy i wartości hasza: for ( keys %hash ) { print ''klucz to ''. $ ; print ''wartosc to '. $hash{ $ }; } Wrócmy teraz do funkcji find. Hasz %options powinien definiować wartości dla pewnego zestawu kluczy. Jeden klucz jest obowiązkowy jest nim klucz 'wanted', dla którego wartość musi zawierać referencję kodu (funkcji) do wywołania. Wartości pozostałych kluczy pozwalają sterować takimi zachowaniami funkcji find jak podążanie za linkami symbolicznymi, automatyczną zmianą CWD po napotkaniu podkatalogu itp. Pełny opis można znaleźć na stronie perldoca. 3 I-węzły, stat i magiczny uchwyt Wewnątrz naszej funkcji zdefiniowanej poprzez referencję typu \&wanted należy umieścić kod dokonujący faktycznego przetwarzania. Innymi słowy, testy z rodzaju -type czy -name lub akcje typu -print i -exec nie są w perlu zdefiniowane i należy po prostu napisać konkretny algorytm przetwarzania z wykorzystaniem narzędzi perlowych. Jednakże przetwarzanie plików zwykle wymaga dostępu do informacji z i-węzła pliku. Informacje te są bazowo dostarczane po użyciu na pliku perlowej funkcji stat. Uwaga! Funkcja ta powinna być dostępna od razu dołącznie do programu modułu File::stat zamienia domyślną funkcję stat na jej inną wersję. Po użyciu stat otrzymamy 13-to elementową listę zawierającą informację o pliku. Dostęp do poszczególnych pól listy można przeprowadzić na kilka sposobów (informacje do znalezienia w Internecie), w instrukcji skupimy się jednak na kilku szczegółach i pułapkach dotyczących użycia tej listy. Po pierwsze, jeden z elementów listy zawiera jednocześnie dwie informacje: typ pliku oraz prawa dostępu. Jest to zachowanie podobne do komend typu ls, które raportują prawa wraz z typem pliku np.: drwxrwxrwx Dodatkowo, perlowa funkcja stat przechowuje te dane jako jedną liczbę w systemie dziesiętnym! Poprawne zbadanie praw dostępu wymaga więc trochę uwagi i wykorzystania np. operatorów bitowych. 3

Drugą kwestią jest różnica pomiędzy stat oraz lstat. Jeśli testujemy dowiązanie symboliczne, to pierwszy zwróci informacje odnośnie i-węzła właściwego dla celu dowiązania (a właściwie końca łańcucha dowiązań), a drugi właściwe dla samego dowiązania. Możemy używać również wielu operatorów plikowych na podobieństwo tych znanych z basha: if ( -f $sciezka ) Operatory te opisane są na stronie perldoc po wyszukaniu hasła -x. Nietypowe są testy -M, -A, -C, które liczą czas od rozpoczęcia skryptu w DNIACH (zmiennoprzecinkowo), a nie w liczbie sekund od tzw. epoki (1 stycznia 1970). Ostatnia uwaga dotyczy wydajności. Wywołanie stat zapisuje wynik (informacje o i-węźle) w odpowiednim miejscu w pamięci. Co więcej identyczna sytuacja ma miejscu w sytuacji, gdy wykorzystujemy operatory plikowe typu -f czy -d nadpiszą one to samo miejsce w pamięci. Jeśli każde wywołanie statuje osobny plik, to sytuacji nie można poprawić. Jeśli jednak statujemy ten sam plik, to chcemy uniknąć zapisów typu: stat $sciezka; if ( -f $sciezka -d $sciezka ) które powodują 3-krotne zapisanie do pamięci informacji o tym samym i-węźle. Rozwiązaniem może być użycie magicznego uchwytu danego symbolem '' ''. Użycie go zamiast ścieżki (zarówno dla stat, -f, -d i innych operatorów plikowych) spowoduje odwołanie się do istniejącej już zapisanej struktury i-węzła w pamięci. Przykład poprzedni możemy wtedy zapisać jako: stat $sciezka; if ( -f -d ) Ten trik należy jednak stosować ostrożnie, pamiętając o kilku szczegółach: 1. Magiczny uchwyt, a magiczna zmienna $ to NIE jest to samo! 2. Domyślnym argumentem dla stat i operatorów typu -f jest $, a nie! Tak więc jeśli chcemy użyć uchwytu, to trzeba go podać jawnie (z wyjątkiem cukierka składniowego opisanego poniżej)! 3. Użycie magicznego uchywtu jest uzasadnione tylko za drugim i kolejnym podejściem tzn. gdy mamy pewność, że w pamięci znajdują się już informacje o pliku, który nas interesuje. Zwykle oznacza to, że pierwsze użycie stat lub operatorów typu -f musi odbyć się z podaniem ścieżki lub normalnego uchwytu. Jest to szczególnie istotne, jeśli stat lub operatory plikowe wywołane są pod warunkiem, należy wtedy zdawać sobie sprawę czy dany plik był statowany czy nie. 4. Pamiętajmy, że lstat i -l statują link symboliczny, a nie jego cel! Oznacza to, że użycie -l po stat $sciezka jest zwykle błędem, bo potencjalnie prowadzi to do statowania dwóch różnych plików. 4

Dodatkowo, w nowszych wersjach perla istnieje cukierek składniowy. Poniższy kod: -f $sciezka && -r && -x może zostać zapisany jako: -f -r -x $sciezka Należy zauważyć, że działa to tylko dla operatora AND (&&), a nie dla OR ( ). Oczywiście, jeśli $sciezka została już wcześniej zestatowana, to możemy od razu użyć magicznego uchwytu: -f -r -x 5