پرش به محتوا

پیش‌نویس:گلوب (برنامه نویسی)

از ویکی‌پدیا، دانشنامهٔ آزاد

در برنامه نویسی کامپیوتری، الگو های گلوب ( ‎/ɡlɒb/‎ ) مجموعه ای از نام فایل ها را با کاراکترهای عمومی مشخص می‌کنند. به عنوان مثال، دستور mv *.txt textfiles/ که یک دستور پوسته Bash یونیکس است همه فایل‌هایی که انتهای نام‌شان به .txt ختم می‌شوند را از پوشه فعلی به پوشه textfiles منتقل می‌کند. در اینجا * یک علامت عمومی و *.txt یک الگوی گلوب است. علامت عمومی * در اینجا به معنی "هر رشته ای با هر طولی از جمله طول صفر، اما به استثنای کاراکتر های جداکننده مسیر ( / در یونیکس و \ در ویندوز)" است.

علامت عمومی رایج دیگر علامت سوال ( ? ) است که به معنای یک کاراکتر تک است. به عنوان مثال، mv ?.txt shorttextfiles/ همه فایل‌ هایی را که با یک کاراکتر به‌دنبال آن .txt نامگذاری شده‌اند، از فهرست فعلی به پوشه shorttextfiles دایرکتوری منتقل می‌کند، در حالی که ??.txt با تمام فایل هایی که نام آنها از هر 2 کاراکتر تشکیل شده است و به .txt

ختم می‌شوند، مطابقت دارد.

علاوه بر تطبیق نام فایل‌ها، از گلوب‌ها به طور گسترده برای تطبیق رشته‌های مختلف ( تطبیق حروف عمومی ) نیز استفاده می‌شود. در این عرصه یک مثال عام fnmatch است.

خاستگاه[ویرایش]

تصویری از صفحه مرجع اصلی یونیکس 1971 برای glob - مالک dmr است، مخفف دنیس ریچی .

دستور گلوب، مخفف گلوبال{{ به انگلیسی | global }} ، از اولین نسخه‌های یونیکس{{ به انگلیسی | Unix }} آزمایشگاه بل سرچشمه می‌گیرد.[۱] مفسر های دستور نسخه های اولیه یونیکس (نسخه های اول تا ششم، 1969-1975) به برنامه‌ای جداگانه متکی بودند تا کاراکترهای عمومی درون آرگومان های نقل قول نشده را به یک دستور گسترش دهد: /etc/glob . آن برنامه گسترش را انجام می‌داد و لیست مسیر های گسترش یافته را برای دستور، به منظور اجرا شدن، فراهم می‌کرد.

گلوب در اصل با زبان برنامه نویسی B نوشته شده بود. این اولین نرم افزار خط اصلی یونیکس بود که با استفاده از یک زبان برنامه نویسی سطح بالا توسعه یافت. [۲] بعدها، این قابلیت به صورت یک تابع کتابخانه زبان سی{{ به انگلیسی | C }}، glob() ارائه شد که توسط برنامه هایی مانند شل استفاده می شد. این تابع معمولاً با استفاده از تابعی دیگر به نام fnmatch() تعریف می‌شود. تابع fnmatch() تطابق دو رشته را برسی می‌کند. برنامه‌ای که از این تابع استفاده می‌کند می‌تواند بر روی مجموعه ای از رشته ها (معمولا نام فایل ها) حرکت کند تا مشخص کند کدام رشته ها مطابقت دارند. هر دو این توابع بخشی از پازیکس {{ به انگلیسی | POSIX }} هستند: توابع در POSIX.1 از سال 2001 ، و نوشتار آن ها در POSIX.2 تعریف شده است. [۳] [۴] ایده تعریف یک تابع تطبیق جداگانه با wildmat (تطابق کارت عمومی) که یک کتابخانه ساده برای تطبیق رشته در مقابل گلوب بش {{ به انگلیسی | bash }} است شروع شد.

به‌طور سنتی، گلوب‌ها با فایل‌های مخفی به شکل Dotfiles در یونیکس مطابقت ندارند. برای مطابقت با آنها، الگو مورد استفاده باید به الزاما با نقطه ( . ) شروع شود. برای مثال، * با تمام فایل های قابل مشاهده تطابق دارد در حالی که . * با تمام فایل های مخفی تطابق خواهد داشت.

نوشتار[ویرایش]

رایج ترین حروف عمومی عبارتند از *, ? ، و […].

علامت شرح مثال مطابقت دارد مطابقت ندارد
* با هر تعداد کاراکتر از حرف ها از جمله هیچ حرف مطابقت دارد Law* Law ، Laws ، یا Lawyer GrokLaw ، La ، یا aw
*Law* Law, GrokLaw, یا Lawyer . La یا aw
? با هر کاراکتر تک مطابقت دارد ?at Cat ، cat ، Bat یا bat at
[abc] با یکی از کاراکتر داده شده درون براکت مطابقت دارد [CB]at Cat یا Bat cat ، bat یا CBat
[a-z] با یک کاراکتر از محدوده داده شده در براکت مطابقت دارد Letter[0-9] Letter0, Letter1, Letter2 تا Letter9 Letters ، Letter یا Letter10

معمولا، کاراکتر جداکننده مسیر ( / در لینوکس/یونیکس، MacOS، و غیره یا \ در ویندوز) هرگز مطابقت نخواهد داشت. برخی از شل ها، مانند Bash، قابلیت ای دارند که به کاربران اجازه می‌دهد تا این مورد را دور بزنند. [۵]

شبه‌یونیکس[ویرایش]

در سیستم های شبه یونیکس *, ? به صورت بالا تعریف شده اند، در صورتی که […] دو معنی اضافه دارد:[۶][۷]

علامت شرح مثال مسابقات مطابقت ندارد
[!abc] با یک کاراکتر که در براکت ذکر نشده است مطابقت دارد [!C]at Bat ، bat یا cat Cat
[!a-z] با یک کاراکتر مطابقت دارد که از محدوده داده شده در براکت نیست Letter[!3-5] Letter1 ، Letter2 ، Letter6 تا Letter9 و Letterx و غیره. Letter3 ، Letter4 ، Letter5 یا Letterxx

محدوده ها همچنین می‌توانند کلاس‌های کاراکتر از پیش تعریف‌شده، کلاس های هم ارز برای کاراکتر های تاکیدی، و نماد های مشابه برای کاراکتر هایی که تابپ کردن آن ها دشوار است را شامل شوند. آنها برای ترکیب با براکت ها در عبارت های منظم POSIX تعریف شده اند.[۶][۷]

گلوبینگ {{ به انگلیسی | globbing }} یونیکس طبق سنت POSIX توسط پوسته اداره می شود. گلوبینگ روی نام فایل ها در خط فرمان و در شل اسکریپت ها ارائه می شود. عبارت case که توسط پازیکس الزام شده در پوسته ها تطبیق الگو را با استفاده از الگوهای glob فراهم می کند.

برخی از پوسته ها (مانند پوسته C و Bash ) از نوشتار های اضافی که به با عنوان های متناوب یا گسترش شاخه شناخته می شود نیز پشتیبانی می‌کنند. از آنجایی این نوشتار های اضافی بخشی از نوشتار گلوب نیستند، در case ارائه نشده اند. آن ها فقط در خط فرمان قبل از اجرای گلوبینگ گسترش می‌یابند.

پوسته بش از افزونه های زیر نیز پشتیبانی می کند: [۸]

  • گلوبینگ گسترش یافته (extglob): به دیگر عملگرهای تطبیق الگو اجازه می دهد تا برای تطبیق چندین رخداد یک الگوی محصور درون پرانتز استفاده شوند. اساساً ستاره کلین گمشده و تناوب را برای توصیف زبان های معمولی فراهم می کند. با تنظیم گزینه extglob shell می توان آن را فعال کرد. این گزینه از ksh93 آمده است.[۹] گنو fnmatch و گلوب یک افزونه مشابه دارند.
  • globstar: به ** به تنهایی به عنوان یک جزء نام اجازه می دهد تا به صورت بازگشتی هر تعداد از لایه های پوشه های غیر مخفی را مطابقت دهد.[۹] همچنین توسط کتابخانه های JS و glob در Python پشتیبانی می شود.
دستور dir با الگوی glob در IBM PC DOS 1.0.

نسخه اصلی داس {{ به انگلیسی | DOS }} مشابه سی‌پی/ام {{به انگلیسی | CP/M }} بود که برای کار بر روی پردازنده های 8088 و 8086 اینتل طراحی شده بود. پوسته های ویندوز، به دنبال DOS، به طور سنتی هیج گسترش گلوب ای روی مقادیر ارسال شده به برنامه های خارجی انجام نمی‌دهند. شل ها می‌توانند از یک افزونه برای دستورات داخلی خود استفاده کنند:

  • پاورشل ویندوز {{به انگلیسی | Windows Powershell }} تمام نوشتار های رایج تعریف شده در بالا را بدون هیچ گونه افزودنی ای دارد.[۱۰]
  • COMMAND.COM و cmd.exe اکثر نوشتار های رایج را با برخی محدودیت ها دارند: […] نوشتار برای هیچ یک وجود ندارد و برای COMMAND.COM نوشتار * فقط می‌تواند در انتهای الگو ظاهر شود و نمی‌تواند در وسط یک الگو بیاید، مگر بلافاصله قبل از نقطه جداکننده پسوند نام فایل .

برنامه‌های ویندوز و داس به‌جای پارامترهایی به سبک argv، یک رشته خط فرمان طولانی دریافت می‌کنند و انجام هرگونه تقسیم، نقل‌قول، و یا گسترش با استفاده از گلوب وظیفه خودشان است. در واقع، هیچ روش ثابتی برای توصیف حروف عمومی در برنامه ها وجود ندارد، زیرا آنها آزاد هستند تا آنچه را که می‌خواهند انجام دهند. دو گسترش دهنده گلوب رایج عبارتند از: [۱۱]

  • گسترش دهنده خط فرمان اجرا کننده C مایکروسافت (msvcrt)، که فقط از ? و * پشتیبانی می‌کند.[۱۲] ReactOS (crt/misc/getargs.c) و Wine (msvcrt/data.c) هر دو شامل یک پیاده‌سازی منبع باز سازگار از __getmainargs هستند، عملکردی که دور از چشم، در CRT اصلی خود کار می‌کند.
  • گسترش دهنده خط فرمان Cygwin و MSYS dcrt0.cc که پس از تقسیم آرگومان ها از روال glob() به سبک یونیکس استفاده می کند.

بیشتر بخش‌های دیگر ویندوز، از جمله سرویس نمایه گذاری، از روش استفاده شده توسط MS-DOS برای حروف عمومی که در CMD یافت می‌شود استفاده می‌کنند. یک یادگاری از زمان نام فایل 8.3، این نوشتار توجه ویژه ای به نقاط در الگو و متن (نام فایل) دارد. در داخل، این کار با استفاده از سه حرف عمومی اضافی <>" انجام می‌شود. در سمت API ویندوز، glob()معادل FindFirstFile است و fnmatch() متناظر با زیربنای آن، RtlIsNameInExpression است. [۱۳] (یک آنالوگ fnmatch دیگر، PathMatchSpec است.) هر دوی این گسترش دهنده های منبع باز msvcrt از FindFirstFile استفاده می‌کنند، بنابراین ویژگی های نام فایل 8.3، در آنها نیز اعمال می‌شوند.

SQL[ویرایش]

عملگر LIKE در SQL معادل ? و * ، و نه […] است.

حروف عام رایج حروف SQL شرح
? _ با هر کاراکتر تک مطابقت دارد
* % با هر تعداد کاراکتر از جمله صفر کاراکتر مطابقت دارد

اگرچه اصطلاح "گلوب" به طور کلی در جامعه SQL استفاده نمی شود، اما SQL استاندارد در عملگر LIKE خود از یک نوشتار شبه گلوب برای تطبیق رشته ساده استفاده می کند. علامت درصد ( % ) با صفر یا چند کاراکتر و زیرخط ( _ ) دقیقاً با یک کاراکتر تطابق دارد.

بسیاری از پیاده‌سازی‌های SQL عملگر LIKE را گسترش داده‌اند تا به زبان تطبیق الگوی غنی‌تری دست یابند که محدوده کاراکترها ( […] )، وجود نداشتن آنها، و عناصر عبارات منظم را در خود بگنجانند.[۱۴]

در مقایسه با عبارات منظم[ویرایش]

گلوب ها شامل نوشتاری برای ستاره کلین نیست که امکان تکرار چندگانه قسمت قبلی عبارت را فراهم می کند. بنابراین آنها عبارات منظم در نظر گرفته نمی‌شوند که (عبارات منظم) می تواند مجموعه کامل زبان های منظم را بر روی هر الفبای محدودی توصیف کند.

حروف عام رایج عبارت منظم معادل
? .
* .*

گلوب ها تلاش می‌کنند تا کل رشته را تطبیق دهند (به عنوان مثال، S*.DOC با S.DOC و SA.DOC مطابقت دارد، اما نه با POST.DOC یا SURREY.DOCKS )، اگرچه، بسته به جزئیات پیاده سازی، عبارات منظم ممکن است با یک رشته زیرمجموعه مطابقت داشته باشند.

  1. https://web.archive.org/web/20000829224359/http://cm.bell-labs.com/cm/cs/who/dmr/man71.pdf
  2. http://www.cs.dartmouth.edu/~doug/reader.pdf
  3. «fnmatch - manned.org». manned.org. دریافت‌شده در ۲۰۲۴-۰۶-۲۰.
  4. «glob - manned.org». manned.org. دریافت‌شده در ۲۰۲۴-۰۶-۲۰.
  5. https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching بایگانی‌شده در ۲۰۱۸-۰۳-۱۵ توسط Wayback Machine Bash Reference Manual
  6. ۶٫۰ ۶٫۱ «Shell Command Language». pubs.opengroup.org. دریافت‌شده در ۲۰۲۴-۰۶-۱۹.
  7. ۷٫۰ ۷٫۱ «glob(7) - Linux manual page». man7.org. دریافت‌شده در ۲۰۲۴-۰۶-۱۹.
  8. "Bash globs". greg's bash knowledgebase. Archived from the original on 2019-11-18. Retrieved 25 November 2019.
  9. ۹٫۰ ۹٫۱ «Pattern Matching (Bash Reference Manual)». www.gnu.org. دریافت‌شده در ۲۰۲۴-۰۶-۱۹.
  10. sdwheeler (۲۰۲۳-۱۲-۱۸). «Supporting Wildcard Characters in Cmdlet Parameters - PowerShell». learn.microsoft.com (به انگلیسی). دریافت‌شده در ۲۰۲۴-۰۶-۱۹.
  11. TylerMSFT (۲۰۲۲-۰۲-۰۸). «`main` function and command-line arguments (C++)». learn.microsoft.com (به انگلیسی). دریافت‌شده در ۲۰۲۴-۰۶-۱۹.
  12. "Wildcard Expansion". docs.microsoft.com (به انگلیسی). 8 February 2022.
  13. Wildcards in Windows بایگانی‌شده در ۲۰۱۹-۱۲-۲۴ توسط Wayback Machine.
  14. rwestMSFT (۲۰۲۳-۰۵-۲۳). «LIKE (Transact-SQL) - SQL Server». learn.microsoft.com (به انگلیسی). دریافت‌شده در ۲۰۲۴-۰۶-۲۰.