Narzędzia informatyczne w językoznawstwie
Perl - Podstawowe operacje wejścia/wyjścia
Marcin Junczys-Dowmunt junczys@amu.edu.pl
Zakład Logiki Stosowanej http://www.logic.amu.edu.pl
5. grudnia 2007
Dzisiejszy wykład
I Omówimy sposoby wczytywania danych z wejścia standardowego1
I Zajmiemy się sposobami zapisu danych do wyjścia standardowego i wyjścia błędów
I Omówimy podstawowe sposoby odczytu i zapisu do plików
Dzisiejszy wykład
I Omówimy sposoby wczytywania danych z wejścia standardowego1
I Zajmiemy się sposobami zapisu danych do wyjścia standardowego i wyjścia błędów
I Omówimy podstawowe sposoby odczytu i zapisu do plików
Dzisiejszy wykład
I Omówimy sposoby wczytywania danych z wejścia standardowego1
I Zajmiemy się sposobami zapisu danych do wyjścia standardowego i wyjścia błędów
I Omówimy podstawowe sposoby odczytu i zapisu do plików
Potoki a Perl
C:\> perl test.pl < in.txt > out.txt 2> log.txt
I Podobnie jak w przypadku komend wiersza poleceń możemy przekierować strumienie wejścia/wyjścia
I Złożona komenda perl test.pl działa jak zwykła komenda wiersza poleceń
I W przykładzie przekierujemy plik in.txt na STDIN, zapisujemy STDOUT do out.txt, a STDERR do log.txt
I Najpierw musimy poznać wewnętrzne mechanizmy Perla pozwalające na przetwarzanie strumieni standardowych
Potoki a Perl
C:\> perl test.pl < in.txt > out.txt 2> log.txt
I Podobnie jak w przypadku komend wiersza poleceń możemy przekierować strumienie wejścia/wyjścia
I Złożona komenda perl test.pl działa jak zwykła komenda wiersza poleceń
I W przykładzie przekierujemy plik in.txt na STDIN, zapisujemy STDOUT do out.txt, a STDERR do log.txt
I Najpierw musimy poznać wewnętrzne mechanizmy Perla pozwalające na przetwarzanie strumieni standardowych
Potoki a Perl
C:\> perl test.pl < in.txt > out.txt 2> log.txt
I Podobnie jak w przypadku komend wiersza poleceń możemy przekierować strumienie wejścia/wyjścia
I Złożona komenda perl test.pl działa jak zwykła komenda wiersza poleceń
I W przykładzie przekierujemy plik in.txt na STDIN, zapisujemy STDOUT do out.txt, a STDERR do log.txt
I Najpierw musimy poznać wewnętrzne mechanizmy Perla pozwalające na przetwarzanie strumieni standardowych
Potoki a Perl
C:\> perl test.pl < in.txt > out.txt 2> log.txt
I Podobnie jak w przypadku komend wiersza poleceń możemy przekierować strumienie wejścia/wyjścia
I Złożona komenda perl test.pl działa jak zwykła komenda wiersza poleceń
I W przykładzie przekierujemy plik in.txt na STDIN, zapisujemy STDOUT do out.txt, a STDERR do log.txt
I Najpierw musimy poznać wewnętrzne mechanizmy Perla pozwalające na przetwarzanie strumieni standardowych
Potoki a Perl
C:\> perl test.pl < in.txt > out.txt 2> log.txt
I Podobnie jak w przypadku komend wiersza poleceń możemy przekierować strumienie wejścia/wyjścia
I Złożona komenda perl test.pl działa jak zwykła komenda wiersza poleceń
I W przykładzie przekierujemy plik in.txt na STDIN, zapisujemy STDOUT do out.txt, a STDERR do log.txt
I Najpierw musimy poznać wewnętrzne mechanizmy Perla pozwalające na przetwarzanie strumieni standardowych
Wczytywanie pojedynczego wiersza z STDIN
1 p r i n t " P o d a j i m i e : ";
$ n a m e = < STDIN >;
c h o m p $ n a m e ;
5
p r i n t " Witaj , \" $in \ " ! \ n ";
I z STDIN możemy jedynie wczytywać dane
I Służą do tego operator <...> oraz operator przypisania =
I Fragment STDIN to nazwa uchwytu do pliku, tutaj do wejścia standardowego
I Wywoływanie operatora <...> domyślnie powoduje wczytanie jednego wiersza wraz ze znakiem terminującym
I Funkcja chomp usuwa znaki terminujące
Wczytywanie pojedynczego wiersza z STDIN
1 p r i n t " P o d a j i m i e : ";
$ n a m e = < STDIN >;
c h o m p $ n a m e ;
5
p r i n t " Witaj , \" $in \ " ! \ n ";
I z STDIN możemy jedynie wczytywać dane
I Służą do tego operator <...> oraz operator przypisania =
I Fragment STDIN to nazwa uchwytu do pliku, tutaj do wejścia standardowego
I Wywoływanie operatora <...> domyślnie powoduje wczytanie jednego wiersza wraz ze znakiem terminującym
I Funkcja chomp usuwa znaki terminujące
Wczytywanie pojedynczego wiersza z STDIN
1 p r i n t " P o d a j i m i e : ";
$ n a m e = < STDIN >;
c h o m p $ n a m e ;
5
p r i n t " Witaj , \" $in \ " ! \ n ";
I z STDIN możemy jedynie wczytywać dane
I Służą do tego operator <...> oraz operator przypisania =
I Fragment STDIN to nazwa uchwytu do pliku, tutaj do wejścia standardowego
I Wywoływanie operatora <...> domyślnie powoduje wczytanie jednego wiersza wraz ze znakiem terminującym
I Funkcja chomp usuwa znaki terminujące
Kolejne wczytywanie wszystkich wierszy z STDIN
1 w h i l e(d e f i n e d( $ l i n e = < STDIN >)) { c h o m p $ l i n e ;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $ l i n e ).
" z n a k o w \ n ";
5 }
I Kolejne wywołania operatora <...> wczytują kolejne wiersze
I Gdy operator dotrze do końca pliku zwraca wartość undef
I Funkcja defined sprawdza, czy dana wartość jest różna od undef – Dlaczego taka postać warunku?
I Zmienna specjalna $. zawiera aktualny numer wiersza
Kolejne wczytywanie wszystkich wierszy z STDIN
1 w h i l e(d e f i n e d( $ l i n e = < STDIN >)) { c h o m p $ l i n e ;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $ l i n e ).
" z n a k o w \ n ";
5 }
I Kolejne wywołania operatora <...> wczytują kolejne wiersze
I Gdy operator dotrze do końca pliku zwraca wartość undef
I Funkcja defined sprawdza, czy dana wartość jest różna od undef – Dlaczego taka postać warunku?
I Zmienna specjalna $. zawiera aktualny numer wiersza
Kolejne wczytywanie wszystkich wierszy z STDIN
1 w h i l e(d e f i n e d( $ l i n e = < STDIN >)) { c h o m p $ l i n e ;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $ l i n e ).
" z n a k o w \ n ";
5 }
I Kolejne wywołania operatora <...> wczytują kolejne wiersze
I Gdy operator dotrze do końca pliku zwraca wartość undef
I Funkcja defined sprawdza, czy dana wartość jest różna od undef – Dlaczego taka postać warunku?
I Zmienna specjalna $. zawiera aktualny numer wiersza
Kolejne wczytywanie wszystkich wierszy z STDIN
1 w h i l e(d e f i n e d( $ l i n e = < STDIN >)) { c h o m p $ l i n e ;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $ l i n e ).
" z n a k o w \ n ";
5 }
I Kolejne wywołania operatora <...> wczytują kolejne wiersze
I Gdy operator dotrze do końca pliku zwraca wartość undef
I Funkcja defined sprawdza, czy dana wartość jest różna od undef – Dlaczego taka postać warunku?
I Zmienna specjalna $. zawiera aktualny numer wiersza
Kolejne wczytywanie wszystkich wierszy z STDIN
1 w h i l e(d e f i n e d( $ l i n e = < STDIN >)) { c h o m p $ l i n e ;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $ l i n e ).
" z n a k o w \ n ";
5 }
I Kolejne wywołania operatora <...> wczytują kolejne wiersze
I Gdy operator dotrze do końca pliku zwraca wartość undef
I Funkcja defined sprawdza, czy dana wartość jest różna od undef – Dlaczego taka postać warunku?
I Zmienna specjalna $. zawiera aktualny numer wiersza
Kolejne wczytywanie wszystkich wierszy z STDIN (krócej)
1 w h i l e( < STDIN >) { c h o m p;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
5 }
I Taki zapis jest idiomem Perla równoważny z poprzednim przykładem
I Wewnętrznie te dwa programy niczym się nie różnią
I Brak jawnego zapisu do zmiennej, korzystamy ze zmiennej domyślnej $
I Ze zmienną domyślną spotkamy się jeszcze nieraz
Kolejne wczytywanie wszystkich wierszy z STDIN (krócej)
1 w h i l e( < STDIN >) { c h o m p;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
5 }
I Taki zapis jest idiomem Perla równoważny z poprzednim przykładem
I Wewnętrznie te dwa programy niczym się nie różnią
I Brak jawnego zapisu do zmiennej, korzystamy ze zmiennej domyślnej $
I Ze zmienną domyślną spotkamy się jeszcze nieraz
Kolejne wczytywanie wszystkich wierszy z STDIN (krócej)
1 w h i l e( < STDIN >) { c h o m p;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
5 }
I Taki zapis jest idiomem Perla równoważny z poprzednim przykładem
I Wewnętrznie te dwa programy niczym się nie różnią
I Brak jawnego zapisu do zmiennej, korzystamy ze zmiennej domyślnej $
I Ze zmienną domyślną spotkamy się jeszcze nieraz
Wczytywanie wszystkich wierszy z STDIN do tablicy
1 c h o m p( @ w i e r s z e = < STDIN >);
f o r e a c h ( @ w i e r s z e ) {
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
5 }
I Użycie operatora <...> w kontekście listowym spowoduje wczytanie wszystkich wierszy do elementów tablicy
I Funkcja chomp wykonana na tablicy powoduje obcięcie znaków terminujących w każdym elemencie tablicy
I Znowu pojawia się zmienna domyślna $ – iteruje ona po wszystkich elementach tablicy
I Tutaj zmienna $. działa w sposób nieoczekiwany – dlaczego?
Wczytywanie wszystkich wierszy z STDIN do tablicy
1 c h o m p( @ w i e r s z e = < STDIN >);
f o r e a c h ( @ w i e r s z e ) {
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
5 }
I Użycie operatora <...> w kontekście listowym spowoduje wczytanie wszystkich wierszy do elementów tablicy
I Funkcja chomp wykonana na tablicy powoduje obcięcie znaków terminujących w każdym elemencie tablicy
I Znowu pojawia się zmienna domyślna $ – iteruje ona po wszystkich elementach tablicy
I Tutaj zmienna $. działa w sposób nieoczekiwany – dlaczego?
Wczytywanie wszystkich wierszy z STDIN do tablicy
1 c h o m p( @ w i e r s z e = < STDIN >);
f o r e a c h ( @ w i e r s z e ) {
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
5 }
I Użycie operatora <...> w kontekście listowym spowoduje wczytanie wszystkich wierszy do elementów tablicy
I Funkcja chomp wykonana na tablicy powoduje obcięcie znaków terminujących w każdym elemencie tablicy
I Znowu pojawia się zmienna domyślna $ – iteruje ona po wszystkich elementach tablicy
I Tutaj zmienna $. działa w sposób nieoczekiwany – dlaczego?
Wczytywanie wszystkich wierszy z STDIN do tablicy
1 c h o m p( @ w i e r s z e = < STDIN >);
f o r e a c h ( @ w i e r s z e ) {
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
5 }
I Użycie operatora <...> w kontekście listowym spowoduje wczytanie wszystkich wierszy do elementów tablicy
I Funkcja chomp wykonana na tablicy powoduje obcięcie znaków terminujących w każdym elemencie tablicy
I Znowu pojawia się zmienna domyślna $ – iteruje ona po wszystkich elementach tablicy
I Tutaj zmienna $. działa w sposób nieoczekiwany – dlaczego?
Wczytywanie wszystkich wierszy z STDIN do tablicy
1 c h o m p( @ w i e r s z e = < STDIN >);
f o r e a c h ( @ w i e r s z e ) {
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
5 }
I Użycie operatora <...> w kontekście listowym spowoduje wczytanie wszystkich wierszy do elementów tablicy
I Funkcja chomp wykonana na tablicy powoduje obcięcie znaków terminujących w każdym elemencie tablicy
I Znowu pojawia się zmienna domyślna $ – iteruje ona po wszystkich elementach tablicy
I Tutaj zmienna $. działa w sposób nieoczekiwany – dlaczego?
Zapisywanie do STDOUT
1 p r i n t S T D O U T " W y p i s u j e m y d a n e do S T D O U T ";
I Wyjście standardowe jest takie jak jego nazwa wskazuje
I Korzystając z print domyślnie (standardowo!) zapisujemy do wyjścia standardowego STDOUT
I Możemy więc opuścić nazwę uchwytu:
1 p r i n t " W y p i s u j e m y d a n e do S T D O U T ";
Zapisywanie do STDOUT
1 p r i n t S T D O U T " W y p i s u j e m y d a n e do S T D O U T ";
I Wyjście standardowe jest takie jak jego nazwa wskazuje
I Korzystając z print domyślnie (standardowo!) zapisujemy do wyjścia standardowego STDOUT
I Możemy więc opuścić nazwę uchwytu:
1 p r i n t " W y p i s u j e m y d a n e do S T D O U T ";
Zapisywanie do STDOUT
1 p r i n t S T D O U T " W y p i s u j e m y d a n e do S T D O U T ";
I Wyjście standardowe jest takie jak jego nazwa wskazuje
I Korzystając z print domyślnie (standardowo!) zapisujemy do wyjścia standardowego STDOUT
I Możemy więc opuścić nazwę uchwytu:
1 p r i n t " W y p i s u j e m y d a n e do S T D O U T ";
Zapisywanie do STDOUT
1 p r i n t S T D O U T " W y p i s u j e m y d a n e do S T D O U T ";
I Wyjście standardowe jest takie jak jego nazwa wskazuje
I Korzystając z print domyślnie (standardowo!) zapisujemy do wyjścia standardowego STDOUT
I Możemy więc opuścić nazwę uchwytu:
1 p r i n t " W y p i s u j e m y d a n e do S T D O U T ";
Zapisywanie do STDERR
1 p r i n t S T D E R R " W y p i s u j e m y d a n e do S T D E R R ";
I Gdy zapisujemy dane do STDERR, musimy jawnie podać nazwę uchwytu
Uchwyty do plików
I Poznaliśmy juz trzy standardowe uchwyty do plików (wirtualnych): STDIN, STDOUT i STDERR
I STDIN to uchwyt otwarty tylko do odczytu
I STDOUT oraz STDERR są otwarte tylko do zapisu
I Możemy tworzyć własne uchwyty do konkretnych plików
I Własne uchwyty obsługujemy tak samo jak uchwyty standardowe
Uchwyty do plików
I Poznaliśmy juz trzy standardowe uchwyty do plików (wirtualnych): STDIN, STDOUT i STDERR
I STDIN to uchwyt otwarty tylko do odczytu
I STDOUT oraz STDERR są otwarte tylko do zapisu
I Możemy tworzyć własne uchwyty do konkretnych plików
I Własne uchwyty obsługujemy tak samo jak uchwyty standardowe
Uchwyty do plików
I Poznaliśmy juz trzy standardowe uchwyty do plików (wirtualnych): STDIN, STDOUT i STDERR
I STDIN to uchwyt otwarty tylko do odczytu
I STDOUT oraz STDERR są otwarte tylko do zapisu
I Możemy tworzyć własne uchwyty do konkretnych plików
I Własne uchwyty obsługujemy tak samo jak uchwyty standardowe
Uchwyty do plików
I Poznaliśmy juz trzy standardowe uchwyty do plików (wirtualnych): STDIN, STDOUT i STDERR
I STDIN to uchwyt otwarty tylko do odczytu
I STDOUT oraz STDERR są otwarte tylko do zapisu
I Możemy tworzyć własne uchwyty do konkretnych plików
I Własne uchwyty obsługujemy tak samo jak uchwyty standardowe
Uchwyty do plików
I Poznaliśmy juz trzy standardowe uchwyty do plików (wirtualnych): STDIN, STDOUT i STDERR
I STDIN to uchwyt otwarty tylko do odczytu
I STDOUT oraz STDERR są otwarte tylko do zapisu
I Możemy tworzyć własne uchwyty do konkretnych plików
I Własne uchwyty obsługujemy tak samo jak uchwyty standardowe
Wczytywanie danych z plików
1 o p e n( IN , " < u c h w y t . pl ")
or die " p l i k nie i s t n i e j e ";
w h i l e( < IN >) {
5 c h o m p;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n "; }
c l o s e( IN );
I Funkcja open służy do tworzenie własnych uchwytów
I Podajemy dwa argumenty: nazwę uchwytu, sposób korzystania z pliku połączony nazwę pliku
I Sposób korzystania dla pliku tylko do odczytu oznaczamy przez <
Wczytywanie danych z plików
1 o p e n( IN , " < u c h w y t . pl ")
or die " p l i k nie i s t n i e j e ";
w h i l e( < IN >) {
5 c h o m p;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n "; }
c l o s e( IN );
I Funkcja open służy do tworzenie własnych uchwytów
I Podajemy dwa argumenty: nazwę uchwytu, sposób korzystania z pliku połączony nazwę pliku
I Sposób korzystania dla pliku tylko do odczytu oznaczamy przez <
Wczytywanie danych z plików
1 o p e n( IN , " < u c h w y t . pl ")
or die " p l i k nie i s t n i e j e ";
w h i l e( < IN >) {
5 c h o m p;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n "; }
c l o s e( IN );
I Funkcja open służy do tworzenie własnych uchwytów
I Podajemy dwa argumenty: nazwę uchwytu, sposób korzystania z pliku połączony nazwę pliku
I Sposób korzystania dla pliku tylko do odczytu oznaczamy przez <
Wczytywanie danych z plików
1 o p e n( IN , " < u c h w y t . pl ")
or die " p l i k nie i s t n i e j e ";
w h i l e( < IN >) {
5 c h o m p;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n "; }
c l o s e( IN );
I Funkcja open służy do tworzenie własnych uchwytów
I Podajemy dwa argumenty: nazwę uchwytu, sposób korzystania z pliku połączony nazwę pliku
I Sposób korzystania dla pliku tylko do odczytu oznaczamy
Zapisywanie danych do plików
1 o p e n( IN , " < u c h w y t . pl ")
or die " p l i k nie i s t n i e j e "; o p e n( OUT , " > log . txt ")
or die " Nie m o g l e m z a p i s a c d a n y c h ";
5
w h i l e( < IN >) { c h o m p;
p r i n t OUT " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
10 }
c l o s e( IN );
c l o s e( OUT );
I Sposób korzystania z uchwytu oznaczamy przez >
I Jak będzie działał znak > a jak znak >> ?
I Zapis do pliku odbywa się jak poprzednio do STDERR
Zapisywanie danych do plików
1 o p e n( IN , " < u c h w y t . pl ")
or die " p l i k nie i s t n i e j e "; o p e n( OUT , " > log . txt ")
or die " Nie m o g l e m z a p i s a c d a n y c h ";
5
w h i l e( < IN >) { c h o m p;
p r i n t OUT " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
10 }
c l o s e( IN );
c l o s e( OUT );
I Sposób korzystania z uchwytu oznaczamy przez >
I Jak będzie działał znak > a jak znak >> ?
I Zapis do pliku odbywa się jak poprzednio do STDERR
Zapisywanie danych do plików
1 o p e n( IN , " < u c h w y t . pl ")
or die " p l i k nie i s t n i e j e "; o p e n( OUT , " > log . txt ")
or die " Nie m o g l e m z a p i s a c d a n y c h ";
5
w h i l e( < IN >) { c h o m p;
p r i n t OUT " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
10 }
c l o s e( IN );
c l o s e( OUT );
I Sposób korzystania z uchwytu oznaczamy przez >
I Jak będzie działał znak > a jak znak >> ?
I Zapis do pliku odbywa się jak poprzednio do STDERR
Zapisywanie danych do plików
1 o p e n( IN , " < u c h w y t . pl ")
or die " p l i k nie i s t n i e j e "; o p e n( OUT , " > log . txt ")
or die " Nie m o g l e m z a p i s a c d a n y c h ";
5
w h i l e( < IN >) { c h o m p;
p r i n t OUT " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
10 }
c l o s e( IN );
c l o s e( OUT );
I Sposób korzystania z uchwytu oznaczamy przez >
I Jak będzie działał znak > a jak znak >> ?
Operator diamentowy <>
1 w h i l e( < >) { c h o m p;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
5 }
I Operator diamentowy to kolejny idiom perlowy (perlizm)
I Operator diamentowy wczytuje wszystkie dane ze wszystkich plików podanych w następujący sposób (jako argumenty do programu w wierszu poleceń):
perl diament.pl plik1.txt plik2.txt ... plikn.txt
I Gdy nie podamy żadnego pliku, wczytuje dane z STDIN
Operator diamentowy <>
1 w h i l e( < >) { c h o m p;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
5 }
I Operator diamentowy to kolejny idiom perlowy (perlizm)
I Operator diamentowy wczytuje wszystkie dane ze wszystkich plików podanych w następujący sposób (jako argumenty do programu w wierszu poleceń):
perl diament.pl plik1.txt plik2.txt ... plikn.txt
I Gdy nie podamy żadnego pliku, wczytuje dane z STDIN
Operator diamentowy <>
1 w h i l e( < >) { c h o m p;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
5 }
I Operator diamentowy to kolejny idiom perlowy (perlizm)
I Operator diamentowy wczytuje wszystkie dane ze wszystkich plików podanych w następujący sposób (jako argumenty do programu w wierszu poleceń):
perl diament.pl plik1.txt plik2.txt ... plikn.txt
I Gdy nie podamy żadnego pliku, wczytuje dane z STDIN
Operator diamentowy <>
1 w h i l e( < >) { c h o m p;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
5 }
I Operator diamentowy to kolejny idiom perlowy (perlizm)
I Operator diamentowy wczytuje wszystkie dane ze wszystkich plików podanych w następujący sposób (jako argumenty do programu w wierszu poleceń):
perl diament.pl plik1.txt plik2.txt ... plikn.txt
I Gdy nie podamy żadnego pliku, wczytuje dane z STDIN
Tablica specjalna @ARGV
I Wewnętrznie operator diamentowy korzysta ze specjalnej wbudowanej tablicy @ARGV
I Ta tablica zawiera wszystkie argumenty podane w wierszu poleceń za nazwą programu
1 for( $i = 0; $i < @ A R G V ; $i ++) {
p r i n t " E l e m e n t o i n d e k s i e $i to $ A R G V [ $i ]\ n "; }
Możemy wykonać powyższy program np. w taki sposób: perl argv.pl zupa tygrys 45 tango 5.7 -h test
Tablica specjalna @ARGV
I Wewnętrznie operator diamentowy korzysta ze specjalnej wbudowanej tablicy @ARGV
I Ta tablica zawiera wszystkie argumenty podane w wierszu poleceń za nazwą programu
1 for( $i = 0; $i < @ A R G V ; $i ++) {
p r i n t " E l e m e n t o i n d e k s i e $i to $ A R G V [ $i ]\ n ";
}
Możemy wykonać powyższy program np. w taki sposób: perl argv.pl zupa tygrys 45 tango 5.7 -h test
Tablica specjalna @ARGV
I Wewnętrznie operator diamentowy korzysta ze specjalnej wbudowanej tablicy @ARGV
I Ta tablica zawiera wszystkie argumenty podane w wierszu poleceń za nazwą programu
1 for( $i = 0; $i < @ A R G V ; $i ++) {
p r i n t " E l e m e n t o i n d e k s i e $i to $ A R G V [ $i ]\ n ";
}
Możemy wykonać powyższy program np. w taki sposób:
perl argv.pl zupa tygrys 45 tango 5.7 -h test
Specjalny uchwyt plikowy DATA
1 w h i l e( < DATA >) { c h o m p;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
5 }
_ _ E N D _ _
T a k i s o b i e t e k s t k t o r y s l u z y
10 j e d y n i e p r z y k l a d e m
I Uchwyt DATA służy tylko do odczytu danych zapisanych po END , kod Perla tutaj nie działa
I Przydatne przy testowaniu programów, nie trzeba tworzyć zewnętrznych plików
Specjalny uchwyt plikowy DATA
1 w h i l e( < DATA >) { c h o m p;
p r i n t " W i e r s z $ .. z a w i e r a ".l e n g t h( $_ ).
" z n a k ó w \ n ";
5 }
_ _ E N D _ _
T a k i s o b i e t e k s t k t o r y s l u z y
10 j e d y n i e p r z y k l a d e m
I Uchwyt DATA służy tylko do odczytu danych zapisanych po END , kod Perla tutaj nie działa
I Przydatne przy testowaniu programów, nie trzeba tworzyć zewnętrznych plików
Podsumowanie
Wiemy teraz jak:
I Wczytywać dane z wejścia standardowego (też z klawiatury)
I Wczytywać dane z dowolnego pliku
I Wczytywać dane ze środowiska DATA
I Korzystać ze zmiennej wbudowanej @ARGV
I Zapisywać dane do wyjścia standardowego i wyjścia błędów
I Zapisywać dane do dowolnego pliku
Wniosek: Nasze programy od tej chwili potrafią się komunikować ze światem zewnętrznym
Podsumowanie
Wiemy teraz jak:
I Wczytywać dane z wejścia standardowego (też z klawiatury)
I Wczytywać dane z dowolnego pliku
I Wczytywać dane ze środowiska DATA
I Korzystać ze zmiennej wbudowanej @ARGV
I Zapisywać dane do wyjścia standardowego i wyjścia błędów
I Zapisywać dane do dowolnego pliku
Wniosek: Nasze programy od tej chwili potrafią się komunikować ze światem zewnętrznym
Podsumowanie
Wiemy teraz jak:
I Wczytywać dane z wejścia standardowego (też z klawiatury)
I Wczytywać dane z dowolnego pliku
I Wczytywać dane ze środowiska DATA
I Korzystać ze zmiennej wbudowanej @ARGV
I Zapisywać dane do wyjścia standardowego i wyjścia błędów
I Zapisywać dane do dowolnego pliku
Wniosek: Nasze programy od tej chwili potrafią się komunikować ze światem zewnętrznym
Podsumowanie
Wiemy teraz jak:
I Wczytywać dane z wejścia standardowego (też z klawiatury)
I Wczytywać dane z dowolnego pliku
I Wczytywać dane ze środowiska DATA
I Korzystać ze zmiennej wbudowanej @ARGV
I Zapisywać dane do wyjścia standardowego i wyjścia błędów
I Zapisywać dane do dowolnego pliku
Wniosek: Nasze programy od tej chwili potrafią się komunikować ze światem zewnętrznym
Podsumowanie
Wiemy teraz jak:
I Wczytywać dane z wejścia standardowego (też z klawiatury)
I Wczytywać dane z dowolnego pliku
I Wczytywać dane ze środowiska DATA
I Korzystać ze zmiennej wbudowanej @ARGV
I Zapisywać dane do wyjścia standardowego i wyjścia błędów
I Zapisywać dane do dowolnego pliku
Wniosek: Nasze programy od tej chwili potrafią się komunikować ze światem zewnętrznym
Podsumowanie
Wiemy teraz jak:
I Wczytywać dane z wejścia standardowego (też z klawiatury)
I Wczytywać dane z dowolnego pliku
I Wczytywać dane ze środowiska DATA
I Korzystać ze zmiennej wbudowanej @ARGV
I Zapisywać dane do wyjścia standardowego i wyjścia błędów
I Zapisywać dane do dowolnego pliku
Wniosek: Nasze programy od tej chwili potrafią się komunikować ze światem zewnętrznym
Podsumowanie
Wiemy teraz jak:
I Wczytywać dane z wejścia standardowego (też z klawiatury)
I Wczytywać dane z dowolnego pliku
I Wczytywać dane ze środowiska DATA
I Korzystać ze zmiennej wbudowanej @ARGV
I Zapisywać dane do wyjścia standardowego i wyjścia błędów
I Zapisywać dane do dowolnego pliku
Wniosek: Nasze programy od tej chwili potrafią się komunikować ze światem zewnętrznym
Podsumowanie
Wiemy teraz jak:
I Wczytywać dane z wejścia standardowego (też z klawiatury)
I Wczytywać dane z dowolnego pliku
I Wczytywać dane ze środowiska DATA
I Korzystać ze zmiennej wbudowanej @ARGV
I Zapisywać dane do wyjścia standardowego i wyjścia błędów
I Zapisywać dane do dowolnego pliku
Wniosek: Nasze programy od tej chwili potrafią się komunikować ze światem zewnętrznym