glob (programowanie) - glob (programming)

W programowaniu komputerowym , glob ( / ɡ l ɑː b / ) wzory określić zestawy z nazwami znaków wieloznacznych . Na przykład polecenie powłoki Unix Bashmv *.txt textfiles/ przenosi ( mv) wszystkie pliki o nazwach kończących się .txtna bieżącym katalogu do katalogu textfiles. Oto *symbol wieloznaczny oznaczający „dowolny ciąg znaków” i *.txtjest wzorcem glob. Innym powszechnym symbolem wieloznacznym jest znak zapytania ( ?), który oznacza jeden znak. Na przykład mv ?.txt shorttextfiles/przeniesie wszystkie pliki nazwane jednym znakiem, po którym następuje.txtz bieżącego katalogu do katalogu shorttextfiles, podczas gdy ??.txtpasowałby do wszystkich plików, których nazwa składa się z 2 znaków, po których następuje .txt.

Oprócz dopasowywania nazw plików, do dopasowywania dowolnych łańcuchów (ang. wildcard matching ) powszechnie używane są również globy . W tym charakterze wspólnym interfejsem jest fnmatch.

Początek

Zrzut ekranu oryginalnej strony referencyjnej Unix z 1971 r. glob– właściciel to dmr, skrót od Dennis Ritchie .

Polecenie glob, skrót od global , pochodzi z najwcześniejszych wersji Uniksa Bell Labs . Interpretery poleceń we wczesnych wersjach Uniksa (od 1 do 6 edycji, 1969-1975) polegały na oddzielnym programie do rozszerzania znaków wieloznacznych w niecytowanych argumentach w poleceniu: /etc/glob . Ten program wykonał rozwinięcie i dostarczył rozszerzoną listę ścieżek plików do polecenia w celu wykonania.

Glob został pierwotnie napisany w języku programowania B . Był to pierwszy element głównego oprogramowania uniksowego, który został opracowany w języku programowania wysokiego poziomu . Później ta funkcjonalność została dostarczona jako C funkcji biblioteki , glob()używane przez programy takie jak skorupy . Zwykle jest ona definiowana na podstawie funkcji o nazwie fnmatch(), która sprawdza, czy łańcuch pasuje do danego wzorca - program używający tej funkcji może następnie iterować przez serię łańcuchów (zwykle nazw plików) w celu określenia, które z nich pasują. Obie funkcje są częścią POSIX : funkcje zdefiniowane w POSIX.1 od 2001 roku oraz składnia zdefiniowana w POSIX.2. Pomysł zdefiniowania oddzielnej funkcji dopasowywania zaczął się od wildmat (dopasowania wieloznacznego), prostej biblioteki do dopasowywania ciągów do kulek Bourne Shell.

Tradycyjnie, globy nie dopasowują ukrytych plików w postaci uniksowych plików dotfiles ; aby je dopasować, wzorzec musi jawnie zaczynać się od .. Na przykład *dopasowuje wszystkie widoczne pliki, a .*dopasowuje wszystkie ukryte pliki.

Składnia

Najczęstszymi są symbole wieloznaczne *, ?i […].

Dzika karta Opis Przykład mecze Nie pasuje
* pasuje do dowolnej liczby dowolnych znaków, w tym żadnego Law* Law, Laws, lubLawyer GrokLaw, La, lubaw
*Law* Law, GrokLawlub Lawyer. La, lub aw
? pasuje do dowolnego pojedynczego znaku ?at Cat, cat, Batlubbat at
[abc] pasuje do jednego znaku podanego w nawiasie [CB]at Cat lub Bat cat, batlubCBat
[a-z] dopasowuje jeden znak z zakresu (zależnego od lokalizacji) podanego w nawiasie Letter[0-9] Letter0, Letter1, Letter2doLetter9 Letters, LetterlubLetter10

Zwykle znak separatora ścieżki ( /w systemie Linux/Unix, MacOS itp. lub \w systemie Windows) nigdy nie zostanie dopasowany. Niektóre powłoki, takie jak Bash, mają funkcjonalność pozwalającą użytkownikom na obejście tego.

Uniksopodobny

Na Unix-like systemów *, ?ma wyżej podane znaczenie, gdy […]ma dwa dodatkowe znaczenie:

Dzika karta Opis Przykład mecze Nie pasuje
[!abc] dopasowuje jeden znak, który nie jest podany w nawiasie [!C]at Bat, bat, lubcat Cat
[!a-z] dopasowuje jeden znak spoza zakresu podanego w nawiasie Letter[!3-5] Letter1, Letter2, Letter6Do Letter9i Letterxetc. Letter3, Letter4, Letter5lubLetterxx

Zakresy mogą również obejmować wstępnie zdefiniowane klasy znaków, klasy równoważności dla znaków akcentowanych i symbole sortowania dla znaków trudnych do wpisania. Są one zdefiniowane tak, aby pasowały do ​​nawiasów w wyrażeniach regularnych POSIX.

Unix globbing jest obsługiwany przez powłokę zgodnie z tradycją POSIX. Globbing jest dostępny w nazwach plików w wierszu poleceń iw skryptach powłoki . Instrukcja obsługiwana przez POSIX casew powłokach zapewnia dopasowywanie wzorców przy użyciu wzorców glob.

Niektóre powłoki (takie jak powłoka C i Bash ) obsługują dodatkową składnię znaną jako alternacja lub rozwijanie nawiasów klamrowych . Ponieważ nie jest częścią składni glob, nie jest udostępniana w programie case. Jest rozwijany tylko w wierszu poleceń przed globbingiem.

Powłoka Bash obsługuje również następujące rozszerzenia:

  • Extended globbing (extglob): pozwala na użycie innych operatorów dopasowywania wzorców do dopasowywania wielu wystąpień wzorca zawartego w nawiasach, zasadniczo dostarczając brakującą gwiazdę kleene i alternatywę do opisywania języków regularnych. Można to włączyć, ustawiając extglobopcję powłoki. Ta opcja pochodzi z ksh93. GNU fnmatch i glob ma identyczne rozszerzenie.
  • globstar: pozwala **jako składnik nazwy rekursywnie dopasowywać dowolną liczbę warstw nieukrytych katalogów. Obsługiwane również przez biblioteki JS i glob Pythona.

Windows i DOS

dirKomenda wzorkiem glob w PC-DOS 1.0.

Oryginalny DOS był klonem CP/M zaprojektowanym do pracy na procesorach Intel 8088 i 8086 . Powłoki Windows, po DOS, tradycyjnie nie wykonują żadnego rozszerzenia glob w argumentach przekazywanych do programów zewnętrznych. Powłoki mogą używać rozszerzenia dla własnych poleceń wbudowanych:

  • Windows PowerShell ma całą wspólną składnię zdefiniowaną powyżej, bez żadnych dodatków.
  • COMMAND.COM i cmd.exe mają większość typowej składni z pewnymi ograniczeniami: nie ma, […]a dla COMMAND.COM *może pojawić się tylko na końcu wzorca. Nie może pojawić się w środku wzorca, z wyjątkiem bezpośrednio poprzedzającej kropkę separatora rozszerzenia nazwy pliku .

Programy Windows i DOS otrzymują długi ciąg wiersza poleceń zamiast parametrów w stylu argv i ich obowiązkiem jest wykonanie dowolnego dzielenia, cytowania lub rozszerzania glob. Technicznie nie ma ustalonego sposobu opisywania symboli wieloznacznych w programach, ponieważ mogą one robić, co chcą. Dwa popularne ekspandery glob obejmują:

  • Ekspander wiersza polecenia Microsoft C Runtime (msvcrt), który obsługuje tylko ?i *. Zarówno ReactOS (crt/misc/getargs.c), jak i Wine (msvcrt/data.c) zawierają kompatybilną implementację open-source __getmainargsfunkcji działającej pod maską, w swoim podstawowym CRT.
  • Cygwin i MSYS dcrt0.ccwiersza polecenia ekspander, który używa stylu Unix glob()rutynowych under-the-kaptur, po rozcięciu argumentów.

Większość innych części systemu Windows, w tym usługa indeksowania, korzysta ze stylu MS-DOS symboli wieloznacznych znajdujących się w CMD. Ta składnia, relikt ery nazw plików 8.3, zwraca szczególną uwagę na kropki we wzorcu i tekście (nazwę pliku). Wewnętrznie odbywa się to za pomocą trzech dodatkowych znaków wieloznacznych, <>". Na końcu interfejsu API systemu Windows odpowiednikiem glob() jest FindFirstFile , a fnmatch() odpowiada jego bazowemu RtlIsNameInExpression . (Kolejnym odpowiednikiem fnmatch jest PathMatchSpec .) Oba ekspandery msvcrt o otwartym kodzie źródłowym używają FindFirstFile , więc będą w nich również obowiązywać dziwactwa dotyczące nazw plików 8.3.

SQL

SQL LIKE Operator ma równoważne ?i *, ale nie […].

Wspólna karta wieloznaczna Symbol wieloznaczny SQL Opis
? _ pasuje do dowolnego pojedynczego znaku
* % pasuje do dowolnej liczby dowolnych znaków, w tym żadnego

Standardowy SQL używa składni podobnej do glob do prostego dopasowywania ciągów w swoim LIKEoperatorze, chociaż termin „glob” nie jest ogólnie używany w społeczności SQL. Znak procentu ( %) odpowiada zero lub większej liczbie znaków, a podkreślenie ( _) odpowiada dokładnie jednemu.

Wiele implementacji SQL rozszerzyło LIKEoperator, aby umożliwić bogatszy język dopasowywania wzorców, obejmujący zakresy znaków ( […]), ich negację i elementy wyrażeń regularnych.

W porównaniu z wyrażeniami regularnymi

Globs nie zawierają składni dla gwiazdy Kleene, która pozwala na wielokrotne powtórzenia poprzedniej części wyrażenia; dlatego nie są uważane za wyrażenia regularne , które mogą opisywać pełny zestaw języków regularnych w dowolnym alfabecie skończonym.

Wspólna karta wieloznaczna Równoważne wyrażenie regularne
? .
* .*

Globy próbują dopasować cały ciąg (na przykład S*.DOCdopasowuje S.DOC i SA.DOC, ale nie POST.DOC ani SURREY.DOCKS), podczas gdy w zależności od szczegółów implementacji wyrażenia regularne mogą pasować do podciągu.

Implementacja jako wyrażenia regularne

Oryginalna implementacja autokonfiguracji proxy Mozilli , która zapewnia funkcję dopasowywania globów na ciągach, używa implementacji replace-as-RegExp, jak powyżej. W takim przykładzie składnia nawiasu jest objęta wyrażeniem regularnym.

Fnmatch Pythona używa bardziej skomplikowanej procedury do przekształcenia wzorca w wyrażenie regularne.

Inne realizacje

Poza zastosowaniami w powłokach, wzorce globs znajdują również zastosowanie w różnych językach programowania, głównie do przetwarzania danych wejściowych przez człowieka. Interfejs w stylu glob do zwracania plików lub interfejs w stylu fnmatch do dopasowywania ciągów można znaleźć w następujących językach programowania:

  • C# ma bibliotekę o nazwie, Globktórą można zainstalować przy użyciu NuGet .
  • D pełni globMatchfunkcję w std.pathmodule.
  • JavaScript posiada bibliotekę o nazwie , minimatchktóra jest używana wewnętrznie przez npm i micromatch, rzekomo bardziej zoptymalizowaną, dokładną i bezpieczniejszą implementację globbingu używaną przez babel i przędzę.
  • Go posiada Globfunkcję w filepathpakiecie.
  • Java posiada Filesklasę zawierającą metody operujące na wzorcach glob.
  • Haskell posiada Globpakiet z modułem głównym System.FilePath.Glob. Składnia wzorca jest oparta na podzbiorze Zsh . Próbuje zoptymalizować dany wzorzec i powinien być zauważalnie szybszy niż naiwne dopasowanie znak po znaku.
  • Perl ma zarówno globfunkcję (jak omówiono w książce Larry'ego Walla " Programowanie w Perlu" ) i rozszerzenie Glob, które naśladuje procedurę glob BSD. Nawiasy kątowe Perla mogą być również użyte do globowania: <*.log>.
  • PHP ma globfunkcję.
  • Python ma globmoduł w standardowej bibliotece, który wykonuje dopasowywanie wzorców symboli wieloznacznych na nazwach plików, oraz fnmatchmoduł z funkcjami do dopasowywania ciągów lub list filtrowania na podstawie tych samych wzorców wieloznacznych. Guido van Rossum , autor języka programowania Python, napisał i wniósł globdo BSD Unix procedurę w 1986 roku. Wcześniej były implementacje glob, np. w programach ex i ftp w poprzednich wydaniach BSD.
  • Ruby ma globmetodę dla Dirklasy, która dopasowuje wzorce wieloznaczne do nazw plików. Kilka bibliotek, takich jak Rant i Rake, udostępnia FileListklasę, która ma metodę glob lub używa tej metody w FileList.[]identyczny sposób .
  • Rust ma bibliotekę o nazwie glob.
  • SQLite posiada GLOBfunkcję.
  • Tcl zawiera funkcję globbingu.

Zobacz też

Bibliografia