küre (programlama) - glob (programming)

Gelen bilgisayar programlama , topak ( / ɡ l ɑː b / ) desenler ile dosya adları kümesi belirleyin joker karakterler . Örneğin, Unix Bash kabuk komutu , adları geçerli dizinden biten tüm dosyaları dizine mv *.txt textfiles/taşır ( mv) . Burada, "herhangi bir karakter dizisi " için duran bir joker karakterdir ve bir glob modelidir. Diğer yaygın joker karakter, bir karakteri temsil eden soru işaretidir ( ). Örneğin, tek bir karakterle adlandırılan tüm dosyaları geçerli dizinden dizine taşırken , adları 2 karakter ve ardından gelen tüm dosyalarla eşleşir . .txttextfiles**.txt?mv ?.txt shorttextfiles/.txtshorttextfiles??.txt.txt

Eşleşen dosya adlarına ek olarak, globlar, rastgele dizeleri eşleştirmek için de yaygın olarak kullanılır ( joker karakter eşleştirme ). Bu kapasitede ortak bir arayüz fnmatch.

Menşei

Orijinal 1971 Unix referans sayfasının ekran görüntüsü glob- sahibi, Dennis Ritchie'nindmr kısaltmasıdır .

global ifadesinin kısaltması olan glob komutu, Bell Labs' Unix'in en eski sürümlerinden kaynaklanır . Unix'in ilk sürümlerinin (1. ila 6. Baskılar, 1969–1975) komut yorumlayıcıları, alıntı yapılmayan bağımsız değişkenlerdeki joker karakterleri bir komuta genişletmek için ayrı bir programa güvendiler : /etc/glob . Bu program, genişletmeyi gerçekleştirdi ve yürütme için komuta giden genişletilmiş dosya yolları listesini sağladı.

Glob orijinal olarak B programlama dilinde yazılmıştır . Unix yazılımının üst düzey bir programlama dilinde geliştirilen ilk parçasıydı . Daha sonra, bu işlevselliği, bir Cı olarak temin edilmiştir kütüphane işlevi , glob()gibi programlar tarafından kullanılan kabuk . Genellikle, fnmatch()bir dizenin belirli bir kalıpla eşleşip eşleşmediğini test eden adlı bir işleve göre tanımlanır - bu işlevi kullanan program, hangilerinin eşleştiğini belirlemek için bir dizi dizeyi (genellikle dosya adlarını) yineleyebilir. Her iki işlev de POSIX'in bir parçasıdır : 2001'den beri POSIX.1'de tanımlanan işlevler ve POSIX.2'de tanımlanan sözdizimi. Ayrı bir eşleşme işlevi tanımlama fikri, dizeleri Bourne Shell küreleriyle eşleştirmek için basit bir kitaplık olan wildmat (joker karakter eşleşmesi) ile başladı .

Geleneksel olarak, küreler, Unix nokta dosyaları biçimindeki gizli dosyalarla eşleşmez ; bunları eşleştirmek için desen açıkça ile başlamalıdır .. Örneğin, *tüm görünür dosyalarla .*eşleşirken tüm gizli dosyalarla eşleşir.

Sözdizimi

En yaygın joker vardır *, ?ve […].

joker karakter Açıklama Örnek Maçlar Eşleşmiyor
* hiçbiri dahil herhangi bir sayıda karakterle eşleşir Law* Law, Laws, veyaLawyer GrokLaw, La, veyaaw
*Law* Law, GrokLaw, veya Lawyer. La, veya aw
? herhangi bir tek karakterle eşleşir ?at Cat, cat, Batveyabat at
[abc] parantez içinde verilen bir karakterle eşleşir [CB]at Cat veya Bat cat, batveyaCBat
[a-z] parantez içinde verilen (yerel ayara bağlı) aralıktaki bir karakterle eşleşir Letter[0-9] Letter0, Letter1, Letter2kadarLetter9 Letters, LetterveyaLetter10

Normalde, yol ayırıcı karakter ( /Linux/Unix, MacOS, vb. veya \Windows'ta) hiçbir zaman eşleşmeyecektir. Bash gibi bazı mermiler, kullanıcıların bunu atlatmasına izin veren işlevselliğe sahiptir.

Unix benzeri

Açık Unix benzeri sistemler *, ?ise yukarıda tanımlandığı gibi olduğu […]iki ek anlamlara sahiptir:

joker karakter Açıklama Örnek Maçlar Eşleşmiyor
[!abc] parantez içinde verilmeyen bir karakterle eşleşir [!C]at Bat, bat, veyacat Cat
[!a-z] parantez içinde verilen aralıktan olmayan bir karakterle eşleşir Letter[!3-5] Letter1, Letter2, Letter6Kadar Letter9ve Letterxvb Letter3, Letter4, Letter5veyaLetterxx

Aralıkların ayrıca önceden tanımlanmış karakter sınıflarını, aksanlı karakterler için denklik sınıflarını ve yazılması zor karakterler için harmanlama sembollerini içermesine izin verilir. POSIX düzenli ifadelerinde parantezlerle eşleşecek şekilde tanımlanırlar.

Unix globbing, POSIX geleneğine göre kabuk tarafından işlenir . Genelleme, komut satırındaki dosya adlarında ve kabuk komut dosyalarında sağlanır . caseKabuklardaki POSIX zorunlu ifadesi, glob kalıplarını kullanarak kalıp eşleştirme sağlar.

Bazı kabuklar ( C kabuğu ve Bash gibi ), değişim veya küme genişletmesi olarak bilinen ek sözdizimini destekler . Glob sözdiziminin bir parçası olmadığı için case. Kürelemeden önce yalnızca komut satırında genişletilir.

Bash kabuğu ayrıca aşağıdaki uzantıları da destekler:

  • Genişletilmiş glob (extglob): Parantez içine alınmış bir kalıbın birden çok örneğini eşleştirmek için diğer kalıp eşleştirme operatörlerinin kullanılmasına izin verir, temel olarak eksik kleene yıldızını ve normal dilleri tanımlamak için değişimi sağlar. extglobKabuk seçeneği ayarlanarak etkinleştirilebilir . Bu seçenek ksh93'ten geldi. GNU fnmatch ve glob aynı uzantıya sahiptir.
  • globstar: **bir ad bileşeni olarak, gizli olmayan dizinlerin herhangi bir sayıdaki katmanlarını yinelemeli olarak eşleştirmeye izin verir . Ayrıca JS kitaplıkları ve Python küresi tarafından da desteklenir.

Windows ve DOS

dirBir gıdım bile desenle komut IBM PC DOS 1.0.

Orijinal DOS , Intel'in 8088 ve 8086 işlemcilerinde çalışmak üzere tasarlanmış bir CP/M klonuydu . DOS'u izleyen Windows kabukları, geleneksel olarak harici programlara iletilen bağımsız değişkenlerde herhangi bir glob genişletmesi gerçekleştirmez. Kabuklar, kendi yerleşik komutları için bir genişletme kullanabilir:

  • Windows PowerShell , herhangi bir ekleme yapılmadan yukarıda belirtilen tüm ortak sözdizimine sahiptir.
  • COMMAND.COM ve cmd.exe , bazı sınırlamalarla birlikte ortak söz dizimlerinin çoğuna sahiptir: […]Hiçbiri yoktur ve COMMAND.COM için *yalnızca kalıbın sonunda görünebilir. Dosya adı uzantısı ayırıcı noktasından hemen önceki durum dışında, bir kalıbın ortasında görünemez .

Windows ve DOS programları, argv tarzı parametreler yerine uzun bir komut satırı dizesi alır ve herhangi bir bölme, alıntı veya glob genişletmesi yapmak onların sorumluluğundadır. İstediklerini yapmakta özgür olduklarından, programlarda joker karakterleri tanımlamanın teknik olarak sabit bir yolu yoktur. İki yaygın glob genişletici şunları içerir:

  • Yalnızca ?ve destekleyen Microsoft C Çalışma Zamanı (msvcrt) komut satırı genişletici *. Hem ReactOS (crt/misc/getargs.c) hem de Wine (msvcrt/data.c), çekirdek CRT'lerinde __getmainargskaputun altında çalışan işlevin uyumlu bir açık kaynaklı uygulamasını içerir .
  • Bağımsız değişkenleri böldükten sonra, kaputun altındaki unix tarzı rutini kullanan Cygwin ve MSYS dcrt0.cckomut satırı genişleticisi glob().

Dizin Oluşturma Hizmeti de dahil olmak üzere Windows'un diğer birçok bölümü, CMD'de bulunan MS-DOS joker karakter stilini kullanır. 8.3 dosya adı çağının bir kalıntısı olan bu sözdizimi, desen ve metindeki (dosya adı) noktalara özel önem verir. Dahili olarak bu, üç ekstra joker karakter kullanılarak yapılır, <>". Windows API ucunda, glob() eşdeğeri FindFirstFile'dir ve fnmatch() , temel alınan RtlIsNameInExpression'a karşılık gelir . (Başka bir fnmatch analogu PathMatchSpec'tir .) Her iki açık kaynaklı msvcrt genişletici de FindFirstFile kullanır , bu nedenle 8.3 dosya adı tuhaflıkları da bunlara uygulanacaktır.

SQL

SQL LIKE operatörü bir eşdeğeri vardır ?ve *ancak […].

Ortak joker karakter SQL joker karakteri Açıklama
? _ herhangi bir tek karakterle eşleşir
* % hiçbiri dahil herhangi bir sayıda karakterle eşleşir

Standart SQL, LIKEoperatöründe basit dize eşleştirmesi için glob benzeri bir sözdizimi kullanır , ancak "glob" terimi genellikle SQL topluluğunda kullanılmaz. Yüzde işareti ( %) sıfır veya daha fazla karakterle, alt çizgi ( _) ise tam olarak bir karakterle eşleşir.

SQL'in birçok uygulaması, LIKEkarakter aralıklarını ( […]), bunların olumsuzluğunu ve düzenli ifadelerin öğelerini içeren daha zengin bir kalıp eşleştirme diline izin vermek için operatörü genişletmiştir .

Normal ifadelerle karşılaştırıldığında

Küreler , ifadenin önceki bölümünün birden çok tekrarına izin veren Kleene yıldızı için sözdizimi içermez ; bu nedenle , belirli herhangi bir sonlu alfabe üzerinde düzenli dillerin tamamını tanımlayabilen düzenli ifadeler olarak kabul edilmezler .

Ortak joker karakter Eşdeğer normal ifade
? .
* .*

Glob'lar tüm dizeyi eşleştirmeye çalışır (örneğin, S*.DOCS.DOC ve SA.DOC ile eşleşir, ancak POST.DOC veya SURREY.DOCKS ile eşleşmez), ancak uygulama ayrıntılarına bağlı olarak normal ifadeler bir alt dizeyle eşleşebilir.

Normal ifadeler olarak uygulama

Dizeler üzerinde küresel eşleştirme işlevi sağlayan orijinal Mozilla proxy otomatik yapılandırma uygulaması, yukarıdaki gibi bir RegExp olarak değiştir uygulaması kullanır. Parantez sözdizimi, böyle bir örnekte regex tarafından kapsanır.

Python'un fnmatch modeli, kalıbı düzenli bir ifadeye dönüştürmek için daha ayrıntılı bir prosedür kullanır.

Diğer uygulamalar

Küre kalıpları, kabuklardaki kullanımlarının ötesinde, çeşitli programlama dillerinde, özellikle insan girdisini işlemek için kullanım alanı bulur. Dosyaları döndürmek için glob stili bir arabirim veya dizeleri eşleştirmek için fnmatch stili bir arabirim aşağıdaki programlama dillerinde bulunur:

  • C# , NuGetGlob kullanılarak kurulabilen adlı bir kitaplığa sahiptir .
  • D modülde bir globMatchfonksiyona sahiptir std.path.
  • JavaScript adlı bir kütüphaneye sahiptir minimatchtarafından dahili olarak kullanılır NPM ve micromatch, tarafından kullanılan bir ileri sürülen daha optimize, doğru ve güvenli globbing uygulanmasını babel ve iplik.
  • Go'nun pakette bir Globişlevi var filepath.
  • Java , Filesglob modellerinde çalışan yöntemler içeren bir sınıfa sahiptir .
  • Haskell , Globana modül içeren bir pakete sahiptir System.FilePath.Glob. Kalıp sözdizimi, Zsh'lerin bir alt kümesine dayanır . Verilen kalıbı optimize etmeye çalışır ve saf bir karakter karakter eşleştiriciden belirgin şekilde daha hızlı olmalıdır.
  • Perl'in hem bir globişlevi ( Larry Wall'un Programming Perl kitabında tartışıldığı gibi ) hem de BSD glob rutinini taklit eden bir Glob uzantısı vardır. Perl'in açılı ayraçları aynı zamanda glob için de kullanılabilir: <*.log>.
  • PHP'nin bir globişlevi vardır.
  • Piton bir sahiptir globki gerçekleştirir Joker model dosya isimleri ile eşleşen ve bir standart kitaplığı modülü fnmatchdizeleri eşleşen ya da bu aynı Joker kalıpları temel alan listeler filtre fonksiyonları ile modül. Python programlama dilinin yazarı Guido van Rossum , 1986'da BSD Unix'e bir globrutin yazdı ve katkıda bulundu . Örneğin, BSD'nin önceki sürümlerinde eski ve ftp programlarında . glob
  • Ruby , dosya adlarında joker karakter desen eşleştirmesi gerçekleştiren sınıf globiçin bir yönteme sahiptir Dir. Rant ve Rake gibi birkaç kitaplık FileList, bir glob yöntemine sahip olan veya yöntemi FileList.[]aynı şekilde kullanan bir sınıf sağlar .
  • Pas glob adında bir kütüphaneye sahiptir.
  • SQLite'ın bir GLOBişlevi vardır.
  • Tcl bir globbing tesisi içerir.

Ayrıca bakınız

Referanslar