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