Recent Changes - Search:

Oktatás

* Programozás 1
  + feladatsor
  + GitHub oldal

* Szkriptnyelvek
  + feladatsor
  + quick link

Teaching

* Programming 1 (BI)
  ◇ exercises
  ◇ quick link

teaching assets


Félévek

* 2024/25/2
* archívum


Linkek

* kalendárium
   - munkaszüneti napok '20
* tételsorok
* jegyzetek
* szakdolgozat / PhD
* ösztöndíjak
* certificates
* C lang.
* C++
* C#
* Clojure
* D lang.
* Java
* Nim
* Scala


[ edit | logout ]
[ sandbox | passwd ]

Py3 /

20250603a

Mik 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 wc parancs a szűrő. Inputként megkapja a cat parancs kimenetét, vagyis a szöveges állomány sorait, s kiírja a sorok számát. A szűrők általában a csővezeték (pipe) jobb oldalán szerepelnek.

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 stdin szintén FILE * típusú.

Elég a mellébeszélésből, mutasd a kódot!

Írjunk egy linecount nevű szűrőt, ami csinálja ugyanazt, mint a fenti wc -l, vagyis számolja meg az input sorait.

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 (./…). Javaslom, hogy a szűrőket helyezzük el egy külön mappában, pl. a ~/myfilters -ben, majd ezt a mappát adjuk hozzá a PATH-hoz. Ezután a szűrőnket bárhonnan meg tudjuk hívni, nem kell megadni az elérési utat:

$ cat szoveg.txt | linecount
3

Vegyük észre, hogy itt már nem szerepel a ./ a szűrő neve előtt.

Mi a franc az a PATH? Miről beszélsz?

Sejtettem, hogy lesz ilyen kérdés. Íme:

Cloud City

  

Blogjaim, hobbi projektjeim

* The Ubuntu Incident
* Python Adventures
* @GitHub
* heroku
* extra
* haladó Python
* YouTube listák


Debrecen | la France


[ edit ]

Edit - History - Print *** Report - Recent Changes - Search
Page last modified on 2025 June 03, 14:40