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 .
.txt
textfiles
*
*.txt
?
mv ?.txt shorttextfiles/
.txt
shorttextfiles
??.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
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 , Bat veyabat
|
at
|
[abc]
|
parantez içinde verilen bir karakterle eşleşir |
[CB]at
|
Cat veya Bat
|
cat , bat veyaCBat
|
[a-z]
|
parantez içinde verilen (yerel ayara bağlı) aralıktaki bir karakterle eşleşir |
Letter[0-9]
|
Letter0 , Letter1 , Letter2 kadarLetter9
|
Letters , Letter veyaLetter10
|
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 , Letter6 Kadar Letter9 ve Letterx vb
|
Letter3 , Letter4 , Letter5 veyaLetterxx
|
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 . case
Kabuklardaki 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.
extglob
Kabuk 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
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__getmainargs
kaputun 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.cc
komut satırı genişleticisiglob()
.
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, LIKE
operatö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ı, LIKE
karakter 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*.DOC
S.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# , NuGet
Glob
kullanılarak kurulabilen adlı bir kitaplığa sahiptir . -
D modülde bir
globMatch
fonksiyona sahiptirstd.path
. -
JavaScript adlı bir kütüphaneye sahiptir
minimatch
tarafından dahili olarak kullanılır NPM vemicromatch
, 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
Glob
işlevi varfilepath
. -
Java ,
Files
glob modellerinde çalışan yöntemler içeren bir sınıfa sahiptir . -
Haskell ,
Glob
ana modül içeren bir pakete sahiptirSystem.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
glob
iş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
glob
işlevi vardır. -
Piton bir sahiptir
glob
ki gerçekleştirir Joker model dosya isimleri ile eşleşen ve bir standart kitaplığı modülüfnmatch
dizeleri 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 birglob
rutin 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
glob
için bir yönteme sahiptirDir
. Rant ve Rake gibi birkaç kitaplıkFileList
, bir glob yöntemine sahip olan veya yöntemiFileList.[]
aynı şekilde kullanan bir sınıf sağlar . - Pas glob adında bir kütüphaneye sahiptir.
-
SQLite'ın bir
GLOB
işlevi vardır. - Tcl bir globbing tesisi içerir.