Oktatás * Programozás 1 * Szkriptnyelvek Teaching * Programming 1 (BI) Félévek Linkek * kalendárium |
Py3 /
20250603aMik azok a szűrők? Szűrő (filter) alatt egy olyan programot értünk, amely inputként egy másik program kimenetét veszi át, majd ezen végez valamilyen műveletet. Ez a művelet általában az input valamilyen transzformációját jelenti. Linux alatt már egészen biztosan használtunk szűrőket, még ha ez nem is tudatosult bennünk. Példa: $ cat pelda.txt | wc -l 3 Itt a Ez nagyon szépen hangzik, de ez mire jó nekem? A Unix egyik filozófiája az, hogy rengeteg kis hasznos programot (szűrőt) kapunk, s ezek egy bizonyos dolgot csinálnak, de azt nagyon hatékonyan. A szűrőket pedig, mint kisebb építőelemeket, tetszőleges módon tudjuk összefűzni, s így a segítségükkel egy összetettebb problémát is meg tudunk oldani anélkül, hogy a feladat megoldására egyetlen, nagyobb méretű programot írnánk. A csővezetékben balról jobbra haladnak az adatok, s minden egyes szűrő valamilyen módon transzformálja az adatokat, majd ezen módosított adatokat adja tovább a következő programnak, míg végül megszületik a végeredmény. Példák: $ cat szoveg.txt first line second line END $ cat szoveg.txt | upper FIRST LINE SECOND LINE END $ cat szoveg.txt | upper | lower first line second line end $ cat szoveg.txt | upper | lower | randomcase FIRst liNE secOnD LIne eNd $ cat szoveg.txt | upper | lower | randomcase | title First Line Second Line End A fenti szűrők helyére bármilyen más szűrőt is odaképzelhetünk. És a jó hír az, hogy ilyen szűrőket mi is tudunk írni, s így egy egészen komoly eszköztárat tudunk magunknak összeállítani. Hogyan tudunk saját szűrőt írni? Nagyon egyszerű. Csupán a standard inputról kell olvasni. Ez majdnem ugyanúgy fog kinézni, mintha egy fájlból olvasnánk. A nyelvek többségében a standard input (stdin) típusa megegyezik egy fájlkezelő objektum típusával. C-ben pl. az Elég a mellébeszélésből, mutasd a kódot! Írjunk egy C megoldás: #include <stdio.h> #define BUFFER_SIZE 1024 int main() { char line[BUFFER_SIZE]; int counter = 0; while (fgets(line, sizeof(line), stdin) != NULL) { ++counter; } printf("%d\n", counter); return 0; } $ cat szoveg.txt | ./linecount 3 Python megoldás: #!/usr/bin/env python3 import sys def main(): cnt = 0 for line in sys.stdin: cnt += 1 # print(cnt) ############################################################################## if __name__ == "__main__": main() $ cat szoveg.txt | ./linecount.py 3 Pro tipp Jelenleg így hívtuk meg a szűrőnket: $ cat szoveg.txt | ./linecount 3 Vagyis kitettük az elérési utat ( $ cat szoveg.txt | linecount 3 Vegyük észre, hogy itt már nem szerepel a Mi a franc az a PATH? Miről beszélsz? Sejtettem, hogy lesz ilyen kérdés. Íme:
|
![]() Blogjaim, hobbi projektjeim * The Ubuntu Incident [ edit ] |