Wyjściowka nr. 1 :D
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaPytania i zadania
Odpowiedz na poniższe pytania, wysyłając je mailem do prowadzącego zajęcia. Za każde pytanie jest jeden punkt. Maksymalna liczba punktów możliwa do uzyskania: 5. Poniżej są wszystkie pytania, jakie zostały zadane w czterech grupach ćwiczeniowych.
- Za pomocą jakiej opcji sprawdzić w jaki sposób został skompilowany perl?
Należy wykorzystać opcję -V. Informacja o tej opcji dostępna jest po poleceniach perl -h albo perldoc perlrun lub man perl. Działanie tej opcji dla pewnego systemu operacyjnego może dać np. taki efekt: kliknij tutaj.
- Jaka opcja w perlu służy do zamiany plików "w miejscu", ewentualnie jednocześnie z tworzeniem kopii zapasowej?
Jest to oczywiście opcja -i, która stosowana bez dodatkowych parametrów zmienia plik podany w argumentach wiersza polecenia. Jeżeli podano dodatkowo jakąś część nazwy, np. -i.org, to wtedy stare wersje przetworzonych plików będą skopiowane do plików z przyrostkiem .org zanim zostanie na nich wykonana jakaś modyfikująca operacja.
- Co robi opcja -e?
Opcja ta włącza możliwość podania w wierszu poleceń tekstu, który będzie potraktowany jako skrypt. Można podać kilka takich opcji, a treść skryptu (odpowiednio cytowana, a więc umieszczona w cudzysłowach) musi występować zaraz po opcji -e.
- Jak poprawić wiersz cat plik.txt | perl -e 'print', aby działał prawidłowo?
W kontekście tego przykładu chodzi raczej o przetworzenie każdego wiersza z pliku plik.txt, gdyż do perla przekierowane zostaje standardowe wyjście polecenia cat. W takim zastosowaniu skrypt perla podany po opcji -e nie zadziała właściwie, ponieważ napisany zostanie tylko pusty napis. Należy dodać opcję -n, przed opcją -e. Poprawiony skrypt może wyglądać np. tak:
cat plik.txt | perl -ne 'print'
Innym sposobem poprawienia tego przykładu jest napisanie:perl -ne 'print' plik.txt
Jeszcze inny sposób:cat plik.txt | perl -pe ''
- Czym różni się opcja -F od opcji -a ?
Opcja -F zmienia domyślny separator, jakim jest początkowo spacja przy automatycznym dzieleniu wierszy wejściowych na części. Dzielenie to nie musi być włączone, a opcja ta nie włącza go. Przykładowo, domyślne działanie może być zapisane tak: -F'/\s/', lub (ponieważ znaki // można pominąć) także w ten sposób: -F'\s'. Jeżeli zachodzi potrzeba, należy zmienić domyślny znak na np. znak kropki, lub dowolny inny. W ogólności może to być dowolne wyrażenie regularne perla. Opcja -a działa w ten sposób, że włącza automatyczne wykonanie operacji:
@F = split;
... która jest równoważna (w domyślnym przypadku) operacji:@F = split /\s/,$_;
zatem po wystąpieniu tej opcji dostajemy w tablicy @F podzielony na części wiersz wejściowy. Tablica ta może zawierać tylko jeden element, jeżeli podział nie udał się (nie było elementu dzielącego w wierszu), lub może być pusta, jeżeli wiersz był pusty. Zatem podstawowa różnica jest funkcjonalna: opcja -F ma działanie konfiguracyjne, a opcja -a działa wykonawczo. - Za pomocą jakiej opcji sprawdzić można wersję perla?
Operację taką wykonuje opcja -v, której wynik działania w pewnym systemie jest następujący:
This is perl, v5.8.8 built for x86_64-linux-thread-multi Copyright 1987-2006, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page.
Pierwsza linia tej informacji zawiera wersję perla, która jest zainstalowana w systemie. - Co robi opcja -p?
Jest to opcja włączająca pisanie na standardowe. Wypisywana jest zawsze ta sama zmienna: $_, której wartość oczywiście może się zmieniać (najczęściej zawiera ona wczytany i przetworzony wiersz tekstu). Opcja ta włącza tryb "naśladowania" edytora strumieniowego sed (zobacz man sed). W skrócie, cały program przetwarzany jest w niejawnej pętli, która ma na swoim końcu (a faktycznie w bloku continue) polecenie print:
while(<>){ ... # tutaj cały kod programu np. po opcji -e } continue{ print $_ or warn "-p destination: $!\n"; }
- Jak zmienić plik za pomocą perla tworząc jednocześnie jego kopię zapasową?
Najprościej użyć opcji -i, która służy do modyfikacji plików w czasie ich przetwarzania. Przykładowe zastosowanie, polegające na zamianie słowa "jeden" na słowo "dwa" w pliku plik.txt, może wyglądać np. tak:
perl -pi -e 's/jeden/dwa/' plik.txt
Taki kod zmieni tylko oryginalny plik, dlatego do opcji -i trzeba dodać jeszcze jakiś przyrostek, który będzie dodany do plików z kopią zapasową. Może to być np. rozszerzenie .bak, wtedy przykład ma postać nieco bardziej rozbudowaną:perl -p -i.bak -e 's/jeden/dwa/' plik.txt
Jeżeli napis podany po opcji -i zawiera znak gwiazdki (*), to zamiast niej do nowej nazwy zostanie wstawiona nazwa stara, np. -i*.org dla pliku plik.txt wygeneruje nazwę plik.txt.org. Gdyby to był zapis -iorg-*, wtedy nowa nazwa miałby postać org-plik.txt. Należy pamiętać że tego typu opcje podawane są w powłoce unixowej lub innej, która może mieć własne zdanie na temat interpretacji znaku gwiazdki. Jeżeli następują próby zastąpienia tego znaku np. listą plików dopasowanych do jakiegoś wzorca, całą treść opcji należy otoczyć cudzysłowami. - Co robi takie wykonanie programu: perl -wce 1?
Ten prosty program jest często utożsamiany z programem, który nic nie robi. Niemniej, pewne rzeczy dzieją: uruchamiane jest sprawdzanie składni perla przy włączonym wypisywaniu ostrzeżeń. Dodatkowo, treścią programu jest cyfra 1, która NIE jest wykonywana ze względu na opcję -c, która pozwala wykonać tylko bloki BEGIN, CHECK oraz pragmy use. Kod tego typu jest zatem ignorowany, a faktycznie stanowi on prostą wartość umieszczoną w kontekście pustym. Na dowód tego, że kod ten nie jest wykonywany, można zmienić ten program i napisać:
perl -wce 'print 1'
Nie zostanie wypisana cyfra 1. Dla odróżnienia, napisanieperl -wce 'BEGIN{print 1}'
będzie wykonane i cyfra się pojawi na standardowym wyjściu. Napisanie w tym miejscu samotnej cyfry 1 nie wykona praktycznie nic, ze względu na wspomniany kontekst pusty. Taki sam efekt można uzyskać z blokiem CHECK, który również jest wykonywany podczas kompilacji skryptu za pomocą opcji -c. - Jak działa opcja -a?
Włączana jest operacja automatycznego dzielenia wierszy wejściowych na fragmenty umieszczane wewnątrz tablicy @F. Podział odbywa się wg. spacji, chyba że zostało to zmienione opcją -F z podanym nowym ogranicznikiem. Żaden z elementów umieszczonych w tablicy @F nie zawiera już separatora, chyba, że zostanie to wymuszone za pomocą opcji -F zawierającej nawiasy w wyrażeniu regularnym. W takim przypadku separatory będą znajdować się pomiędzy wynikowymi wartościami w tej samej tablicy @F. Aby to zobaczyć na własne oczy, wykonać można polecenia:
echo "foo boo" | perl -F'\s' -alne 'print join "|",@F' echo "foo boo" | perl -F'(\s)' -alne 'print join "|",@F'
- Jaką opcję należy podać perlowi, aby uzyskać krótką pomoc na temat opcji?
Oczywiście, należy podać opcję -h, która jak w wielu innych przypadkach powoduje domyślne wypisanie informacji o argumentach uruchomienia programu. Obsługiwana jest też długa wersja tej opcji: --help, która działa dokładnie w ten sam sposób.
- Co robi opcja -n?
W sensie praktycznym, opcja ta dodaje niejawnie wykonywaną pętlę wokoło skryptu podanego po opcji -e lub jako plik. Dodany kod ma postać:
while(<>){ ... # tutaj znajduje się cały kod skryptu }
Efekt jest zatem taki, że cały kod wykonuje się dla każdego wczytanego wiersza, a każdy kolejny wiersz jest w pętli while wczytywany zawsze do tej samej zmiennej $_. Opcja ta jest podstawą wielu skryptów jednolinijkowych, tzw. oneliner'ów. - Jak działa opcja -0?
Opcja ta służy do określenia co jest separatorem kolejnych wczytywanych wierszy. Domyślnie jest to nowa linia, jednak jeżeli za pomocą tej opcji zostanie to zmienione, dane będą dzielone na "wiersze" według innego znaku. Opcja może wystąpić samodzielnie, bez parametrów, lub może zawierać kod znaku według którego ma nastąpić podział danych wejściowych.
- Wyjaśnij działanie polecenia find . -name "*.tmp" -print0 | perl -n0e unlink
Podane polecenie składa się z wykonania dwóch programów, komunikujących się ze sobą za pomocą operacji wejścia/wyjścia. Pierwszy program to find, który przeszukuje katalog bieżący oraz wszystkie jego podkatalogi w poszukiwaniu plików z rozszerzeniem .tmp. Lista znalezionych w ten sposób plików jest wypisywana razem ze ścieżką na której się znajdują. Każdy wiersz zakończony jest znakiem o kodzie 0 (zero). Za pomocą operatora strumieniowego | dane te są skierowane na standardowe wejście perla, który wczytuje je, traktując znak o kodzie 0 (zero) jak separator wiersza. Powoduje to, że każdy plik wraz z jego ścieżką jest umieszczany przez perla w zmiennej $_ (efekt działania opcji -n). Następnie wykonywany dla każdego takiego wiersza jest skrypt, zawierający jedno polecenie: unlink, które służy (upraszczając) do usuwania pliku. Ponieważ żadna nazwa pliku nie jest podana w sposób jawny (polecenie występuje bez argumentów), używana jest zmienna domyślna, która zawiera nazwę znalezionego przez find pliku. W efekcie działanie tego 'tandemu' poleceń spowoduje skasowanie wszystkich plików z bieżącego poddrzewa katalogów, które miały rozszerzenie .tmp. Niestety, znalazły się na naszych zajęciach osoby, które lekkomyślnie skasowały sobie w ten sposób całą zawartość katalogu domowego (wykorzystując nieco inny kod, którego nie zacytuję)... Gratulacje.
- Jakiej opcji użyć do zmiany pliku "w miejscu"? Podaj przykład.
Zostało to wyjaśnione tutaj (w jednym z poprzednio rozwiązanych zadań).
- Jakie opcje wyświetlają informacje o kompilacji i/lub wersji perla?
Opcja -v oraz -V. Zostało to wyjaśnione wcześniej w odpowiedziach tutaj (-v) oraz tutaj (-V).
- Wyjaśnij działanie opcji -c.
Opcja powoduje sprawdzenie składni programu perlowego podanego w opcji -e lub jako plik i zakończenie pracy, bez faktycznego wykonywania kodu. Kompilowane i wykonywane są bloki BEGIN oraz CHECK, a także wszystkie wystąpienia pragm use ładujące moduły perla. Takie fragmenty programu traktowane są jako "zewnętrzne" i kompilator nie zalicza ich do głównego kodu. Tryb pracy perla z włączoną opcją -c jest sygnalizowany przez ustawienie specjalnej zmiennej $^C, która jest prawdziwa, jeżeli podano opcję -c i nieprawdziwa w przeciwnym wypadku. Dzięki temu można w bloku BEGIN umieścić kod, który wykona się tylko w momencie kompilacji a poza tym nigdy.
- Jak działa opcja -w oraz -W?
Są to opcje włączające tryb pracy z ostrzeżeniami. Opcja -W (wielkie W) włącza tryb ostrzeżeń na stałe, arbitralnie, to znaczy, nie można go wyłączyć z poziomu programu. Opcja -w (małe w) jest obecnie przestarzała, a zamiast niej zaleca się stosować pragmę use warnings; za pomocą której można selektywnie włączać niektóre rodzaje ostrzeżeń. Działanie opcji -w jest też takie, że ustawiana jest zmienna $^W na wartość prawdziwą wtedy, gdy opcja została podana. Za pomocą tej zmiennej (i jest to już znowu przestarzałe) można selektywnie włączać lub wyłączać tryb ostrzeżeń interpretera w trakcie wykonania programu.
- Wyjaśnij szczegóły działania polecenia echo "bla" | perl -pne 1
Polecenie to składa się z dwóch pod-poleceń. Pierwszym z nich jest echo, które wypisuje słowo "bla" na standardowe wyjście, które jest następnie przekierowane na standardowe wejście perla. Perl w tym momencie nie wykonuje zbyt wiele jawnego kodu, ponieważ cały jawny kod podany w poleceniu po opcji -e to 1. Taka cyfra nie spowoduje wywołania ostrzeżenia, ale też niewiele wykona: zostanie obliczona w kontekście pustym, i to wszystko. Cała tajemnica tkwi w opcji -p, dzięki której na standardowym wyjściu perla pojawi się wczytane słowo "bla". Opcja -p dodaje niejawną instrukcję print, która wypisuje zmienną domyślną (zawierającą kolejne wczytywane wiersze). Dlatego po wykonaniu tych poleceń pojawia się słowo "bla". Gdyby zamiast 1 w kodzie skryptu wpisać jawnie słowo print, napis "bla" przy zachowaniu wszystkich opcji bez zmian pojawiłby się dwa razy (jeden pod drugim, ponieważ słowo pisane przez echo zawiera na końcu znak nowego wiersza).
- Czym się różni opcja -m od opcji -M?
Są to dość zaawansowane w swoim działaniu opcje, których głównym zadaniem jest załadowanie modułów perla przed wykonaniem programu (być może jednowierszowego, ale nie jest konieczność, gdyż program może pochodzić też z pliku). Różnica między opcjami jest taka, że -m (małe m) powoduje ładowanie modułu z domyślnie pustą listą importu, natomiast -M ładuje moduły z ich domyślną listą importu (która nie musi być pusta). Pierwszą opcję stosuje się częściej do modułów obiektowych, drugą do nieobiektowych, chociaż nie jest to obligatoryjne. Opcje mają także kilka mniej ważnych podobieństw i różnic (np. są identyczne po zastosowaniu znaku = do selektywnego określania list importu, itp).
Uwaga. Jeżeli na tej stronie znalazłeś błąd, lub znasz lepsze wyjaśnienia zadań, proszę, napisz do mnie na adres manty.
Uniwersytet Gdański - Instytut Informatyki - Strona domowa - Perl - Kolokwia[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.