الفرق بين المراجعتين لصفحة: «Ruby/Dir/glob»

من موسوعة حسوب
< Ruby‏ | Dir
لا ملخص تعديل
مراجعة وتدقيق.
 
(8 مراجعات متوسطة بواسطة مستخدم واحد آخر غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:  التابع <code>glob</code> الخاص بالصنف <code>Dir</code> في روبي}}</noinclude>
<noinclude>{{DISPLAYTITLE:  التابع <code>Dir.glob</code> في روبي}}</noinclude>
[[تصنيف: Ruby]]
[[تصنيف: Ruby]]
[[تصنيف: Ruby Method]]
[[تصنيف: Ruby Method]]
[[تصنيف: Ruby Dir]]
[[تصنيف: Ruby Dir]]
يوسّع التابع <code>glob</code>  الوسيط الممرّر <code>pattern</code> (انظر فقرة البنية العامة)، والذي هو عبارة عن سلسلة نصية نمطية (pattern string) أو مصفوفة من السلاسل النصية النمطية، ويعيد مصفوفة تحتوي أسماء الملفات المتطابقة لذلك النمط. في حال تم إعطاء كتلة (block)، فسيستدعي التابع <code>glob</code> الكتلة مرة واحدة على كل اسم ملف مطابق، بحيث يمرّر اسم الملف كوسيط إلى الكتلة.  
يوسّع التابع <code>glob</code>  الوسيطَ <code>pattern</code> الممرّر (انظر فقرة البنية العامة)، الذي هو سلسلة نصية نمطية (pattern string) أو مصفوفة من السلاسل النصية النمطية، ويعيد مصفوفة تحتوي أسماء الملفات المُطابقة لذلك النمط. في حال تم إعطاء كتلة (block)، فسيستدعي التابع <code>glob</code> الكتلة مرة واحدة على كل اسم ملف مطابق، إذ سيمرّر اسم الملف كوسيط إلى الكتلة.  


يحدد الوسيط الاختياري <code>base</code> المجلد الأساسي (base directory) لتأويل أسماء المسارات (pathnames) بدلاً من مجلد العمل الحالي. بما أنّ النتائج لا تكون مسبوقة باسم المجلد الأساسي في هذه الحالة، فسيكون عليك إضافة اسم المجلد الأساسي إذا أردت الحصول على مسارات حقيقية.  
يحدِّد الوسيط <code>base</code> الاختياري المجلد الأساسي (base directory) لتفسير أسماء المسارات النسبية بدلاً من مجلد العمل الحالي. وبما أنّ النتائج لا تكون مسبوقة باسم المجلد الأساسي في هذه الحالة، فسيكون عليك إضافة اسم المجلد الأساسي إذا أردت الحصول على مسارات صالحة.


تجدر الإشارة إلى أنّ هذا النمط (pattern) ليس تعبيرًا نمطيًا (regexp)، ولكنّه أقرب إلى shell glob. راجع صفحة <code>[[Ruby/File/fnmatch|File.fnmatch]]</code> للتعرف على معنى الوسيط <code>flags</code>.
تجدر الإشارة إلى أنّ هذا النمط (pattern) ليس تعبيرًا نمطيًا (regexp)، ولكنّه أقرب إلى النمط glob في الصدفة (الذي يعتمد على محارف الصدفة الخاصة [wildcard]).


تعتمد الحساسية لحالة الحروف (Case sensitivity) على النظام الخاص بك (يتم تجاهل الملف <code>File::FNM_CASEFOLD</code>) ، كما هو الحال بخصوص الترتيب الذي تٌعاد به النتائج.  
تعتمد الحساسية لحالة الحروف (Case sensitivity) على النظام الخاص بك (يتم تجاهل الملف <code>File::FNM_CASEFOLD</code>)، كما هو الحال بخصوص الترتيب الذي تٌعاد به النتائج.
 
{| class="wikitable"
{| class="wikitable"
!محرف الصدفة الخاص
|*    
! colspan="2" |الوصف
|تطابق كل الملفات. يمكن تقييدها بقيم أخرى في <code>glob</code>. مكافئة لـ <code>‏‎/ .* /x‏</code> في <code>regexp</code>.
|-
|
| rowspan="6" |<code>*</code>
|
*
|
| colspan="2" |يطابق كل الملفات. يمكن تقييده بقيم أخرى في <code>glob</code>. يكافئ <code>‏‎/ .* /x‏</code> في <code>regexp</code>.
|-
|*
|يطابق كل الملفات
|-
|c*‎
|تتطابق مع جميع الملفات التي تبدأ بالحرف <code>c</code>.
|-
|‎*c‎
|تتطابق مع جميع الملفات التي تنتهي بالحرف <code>c</code>.
|-
|*c*
|تطابق جميع الملفات التي تحوي الحرف c  (بما في ذلك في البداية أو النهاية).
|-
| colspan="2" |لاحظ أنّ هذا لن يتطابق مع الملفات المخفية المشابهة لنظام Unix‏ (Unix-like) (الملفات التي تبدأ بنقطة [dotfiles]). لتضمينها في نتائج المطابقة، يجب استخدام الراية <code>File::FNM_DOTMATCH</code> أو شيئًا مثل "<code>{‎*,.*‎}</code>‏".
|-
|<code>**</code>
| colspan="2" |تطابق المجلدات تعاوديًا (recursively).
|-
|?
| colspan="2" |تطابق أي محرف مُفرد، إذ تكافئ <code>/‎.{1}‎/</code> في regexp.
|-
|<code>[set]</code>
| colspan="2" |تتطابق مع أي محرف مُفرد في set. تتصرف بالضبط مثل مجموعات الأحرف في Regexp، بما في ذلك المجموعات المنفية (<code>[‎^a-z]</code>).
|-
|-
|
|<code>{p,q}</code>
|
| colspan="2" |تتطابق حرفيًا إمَّا مع <code>p</code> أو مع <code>q</code>. وتكافئ النمط التناوبي (pattern alternation) في <code>regexp</code>.
|
المطابقة الحرفية قد تكون أكثر من حرف واحد. قد يتم تحديد أكثر من حرفين.
|
|
|-
|-
|
|<code>\</code>
|
| colspan="2" |يُخلّص (Escapes) الحرف  التالي.
|
لاحظ أنّ هذا يعني عدم إمكانية استخدام الشرطة المائلة العكسية (<code>\</code>) في ويندوز  في <code>glob</code>، أي أنّ <code>Dir ["c: \ foo *"]‎</code> لن تعمل؛ استخدم <code>Dir ["c: / foo *"]</code>‎ بدلاً من ذلك.
|
|
|}
|}
<nowiki>*</nowiki> 
==البنية العامة==
 
<nowiki>*</nowiki>
تتطابق مع كل الملفات
ج *
تتطابق مع جميع الملفات التي تبدأ بـ c
<nowiki>*</nowiki> ج
تتطابق مع جميع الملفات التي تنتهي بـ c
<nowiki>*</nowiki> ج *
تطابق جميع الملفات التي لديها ج فيها (بما في ذلك في البداية أو النهاية).
لاحظ أن هذا لن يتطابق مع الملفات المخفية المشابهة لـ Unix (dotfiles). لتضمين النتائج في نتائج المطابقة ، يجب استخدام علامة File :: FNM_DOTMATCH أو ما شابه "{*،. *}".
<nowiki>**</nowiki>
تتطابق مع الدلائل بشكل متكرر.
؟
يطابق أي حرف واحد. مكافئة لـ /.{1}/ في regexp.
[جلس]
تتطابق مع أي حرف واحد في المجموعة. يتصرف بالضبط مثل مجموعات الأحرف في Regexp ، بما في ذلك تعيين negation ([^ a-z]).
{ص، س}
تتطابق مع p الحرفي أو حرفيا ف. أي ما يعادل تكيف نمط في regexp.
قد تكون مطابقة حرفية أكثر من حرف واحد في الطول. قد يتم تحديد أكثر من حرفين حرفيين.
\
يهرب من الحرف الأول التالي.
لاحظ أن هذا يعني أنه لا يمكنك استخدام الشرطة المائلة للخلف على النوافذ كجزء من الكرة الأرضية ، أي أن Dir ["c: \ foo *"] لن يعمل ، استخدم Dir ["c: / foo *"] بدلاً من ذلك.
 
== البنية العامة ==
<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
each_child( dirname ) {| filename | block } nil click to toggle source
glob( pattern, [flags], [base: path] ) → array
each_child( dirname, encoding: enc ) {| filename | block } → nil
glob( pattern, [flags], [base: path] ) { |filename| block } → nil
each_child( dirname ) → an_enumerator
each_child( dirname, encoding: enc ) → an_enumerator
</syntaxhighlight>
</syntaxhighlight>
==المعاملات==
===<code>pattern</code>===
سلسلة نصية نمطية (pattern string) أو مصفوفة من السلاسل النصية النمطية،


== المعاملات ==
=== <code>flags</code> ===
ارجع إلى صفحة التابع <code>[[Ruby/File/fnmatch|File.fnmatch]]</code> للتعرف على الوسيط <code>flags</code>.


=== <code>dirname </code> ===
===<code>base</code>===
يحدد اسم المجلد.
المجلد الأساسي (base directory) لتأويل أسماء المسارات (pathnames)
==القيمة المعادة==
يعيد مصفوفة تحوي أسماء الملفات المطابقة للنمط <code>pattern</code>.
==أمثلة==
مثال عن استخدام التابع <code>glob</code> على المجلد <code>testdir</code> الذي يحوي ملفين عاديين (<code>config.h</code> و <code>main.rb</code>)، والمجلد الأب (<code>..</code>)، والمجلد نفسه (<code>.</code>):<syntaxhighlight lang="ruby">
Dir["config.?"]                    #=> ["config.h"]
Dir.glob("config.?")                #=> ["config.h"]
Dir.glob("*.[a-z][a-z]")            #=> ["main.rb"]
Dir.glob("*.[^r]*")                #=> ["config.h"]
Dir.glob("*.{rb,h}")                #=> ["main.rb", "config.h"]
Dir.glob("*")                      #=> ["config.h", "main.rb"]
Dir.glob("*", File::FNM_DOTMATCH)  #=> [".", "..", "config.h", "main.rb"]


=== <code>encoding</code> ===
rbfiles = File.join("**", "*.rb")
يحدد ترميز المجلد.
Dir.glob(rbfiles)                  #=> ["main.rb",
                                    #    "lib/song.rb",
                                    #    "lib/song/karaoke.rb"]


== القيمة المٌعادة ==
Dir.glob(rbfiles, base: "lib")      #=> ["song.rb",
في حال تمرير كتلة فالقيمة المعادة للتابع <code>chdir</code> ستكون <code>nil</code>، وإلا فسيعاد كائن من النوع [[Ruby/Enumerator|enumerator]].
                                    #    "song/karaoke.rb"]


== أمثلة ==
libdirs = File.join("**", "lib")
مثال عن استخدام التابع <code>glob</code> على المجلد <code>testdir</code> الذي يحتوي ملفين عاديين (<code>config.h</code> و <code>main.rb</code>) ، والمجلد الأب (<code>..</code>) ، والمجلد نفسه (<code>.</code>).<syntaxhighlight lang="ruby">
Dir.glob(libdirs)                   #=> ["lib"]
Dir.each_child("testdir") {|x| puts "Got #{x}" }


</syntaxhighlight>سينتج:<syntaxhighlight lang="ruby">
librbfiles = File.join("**", "lib", "**", "*.rb")
Got config.h
Dir.glob(librbfiles)                #=> ["lib/song.rb",
Got main.rb
                                    #    "lib/song/karaoke.rb"]
</syntaxhighlight>


== أنظر أيضًا ==
librbfiles = File.join("**", "lib", "*.rb")
* صفحة الصنف <code>[[Ruby/Dir|Dir]]</code>.
Dir.glob(librbfiles)                #=> ["lib/song.rb"]
* التابع <code>[[Ruby/Dir/foreach|foreach]]</code>: يستدعي التابع <code>glob</code> الكتلة المعطاة على كل ملف من الملفات المحتواة في المجلد المحدد باستثناء "<code>..</code>" و "<code>.</code>". حيث يمُمرّر أسماء تلك الملفات كوسائط للكتلة. 


== مصادر ==
</syntaxhighlight>
* [http://ruby-doc.org/core-2.5.1/Dir.html#method-c-each_child قسم التابع glob  في الصنف Dir في توثيق روبي الرسمي.]
==انظر أيضًا==
*صفحة الصنف <code>[[Ruby/Dir|Dir]]</code>.
==مصادر==
*[http://ruby-doc.org/core-2.5.1/Dir.html#method-c-glob قسم التابع glob  في الصنف Dir في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 23:40، 10 نوفمبر 2018

يوسّع التابع glob الوسيطَ pattern الممرّر (انظر فقرة البنية العامة)، الذي هو سلسلة نصية نمطية (pattern string) أو مصفوفة من السلاسل النصية النمطية، ويعيد مصفوفة تحتوي أسماء الملفات المُطابقة لذلك النمط. في حال تم إعطاء كتلة (block)، فسيستدعي التابع glob الكتلة مرة واحدة على كل اسم ملف مطابق، إذ سيمرّر اسم الملف كوسيط إلى الكتلة.

يحدِّد الوسيط base الاختياري المجلد الأساسي (base directory) لتفسير أسماء المسارات النسبية بدلاً من مجلد العمل الحالي. وبما أنّ النتائج لا تكون مسبوقة باسم المجلد الأساسي في هذه الحالة، فسيكون عليك إضافة اسم المجلد الأساسي إذا أردت الحصول على مسارات صالحة.

تجدر الإشارة إلى أنّ هذا النمط (pattern) ليس تعبيرًا نمطيًا (regexp)، ولكنّه أقرب إلى النمط glob في الصدفة (الذي يعتمد على محارف الصدفة الخاصة [wildcard]).

تعتمد الحساسية لحالة الحروف (Case sensitivity) على النظام الخاص بك (يتم تجاهل الملف File::FNM_CASEFOLD)، كما هو الحال بخصوص الترتيب الذي تٌعاد به النتائج.

محرف الصدفة الخاص الوصف
*
يطابق كل الملفات. يمكن تقييده بقيم أخرى في glob. يكافئ ‏‎/ .* /x‏ في regexp.
* يطابق كل الملفات
c*‎ تتطابق مع جميع الملفات التي تبدأ بالحرف c.
‎*c‎ تتطابق مع جميع الملفات التي تنتهي بالحرف c.
*c* تطابق جميع الملفات التي تحوي الحرف c (بما في ذلك في البداية أو النهاية).
لاحظ أنّ هذا لن يتطابق مع الملفات المخفية المشابهة لنظام Unix‏ (Unix-like) (الملفات التي تبدأ بنقطة [dotfiles]). لتضمينها في نتائج المطابقة، يجب استخدام الراية File::FNM_DOTMATCH أو شيئًا مثل "{‎*,.*‎}‏".
** تطابق المجلدات تعاوديًا (recursively).
? تطابق أي محرف مُفرد، إذ تكافئ /‎.{1}‎/ في regexp.
[set] تتطابق مع أي محرف مُفرد في set. تتصرف بالضبط مثل مجموعات الأحرف في Regexp، بما في ذلك المجموعات المنفية ([‎^a-z]).
{p,q} تتطابق حرفيًا إمَّا مع p أو مع q. وتكافئ النمط التناوبي (pattern alternation) في regexp.

المطابقة الحرفية قد تكون أكثر من حرف واحد. قد يتم تحديد أكثر من حرفين.

\ يُخلّص (Escapes) الحرف التالي.

لاحظ أنّ هذا يعني عدم إمكانية استخدام الشرطة المائلة العكسية (\) في ويندوز في glob، أي أنّ Dir ["c: \ foo *"]‎ لن تعمل؛ استخدم Dir ["c: / foo *"]‎ بدلاً من ذلك.

البنية العامة

glob( pattern, [flags], [base: path] )  array 
glob( pattern, [flags], [base: path] ) { |filename| block }  nil

المعاملات

pattern

سلسلة نصية نمطية (pattern string) أو مصفوفة من السلاسل النصية النمطية،

flags

ارجع إلى صفحة التابع File.fnmatch للتعرف على الوسيط flags.

base

المجلد الأساسي (base directory) لتأويل أسماء المسارات (pathnames)

القيمة المعادة

يعيد مصفوفة تحوي أسماء الملفات المطابقة للنمط pattern.

أمثلة

مثال عن استخدام التابع glob على المجلد testdir الذي يحوي ملفين عاديين (config.h و main.rb)، والمجلد الأب (..)، والمجلد نفسه (.):

Dir["config.?"]                     #=> ["config.h"]
Dir.glob("config.?")                #=> ["config.h"]
Dir.glob("*.[a-z][a-z]")            #=> ["main.rb"]
Dir.glob("*.[^r]*")                 #=> ["config.h"]
Dir.glob("*.{rb,h}")                #=> ["main.rb", "config.h"]
Dir.glob("*")                       #=> ["config.h", "main.rb"]
Dir.glob("*", File::FNM_DOTMATCH)   #=> [".", "..", "config.h", "main.rb"]

rbfiles = File.join("**", "*.rb")
Dir.glob(rbfiles)                   #=> ["main.rb",
                                    #    "lib/song.rb",
                                    #    "lib/song/karaoke.rb"]

Dir.glob(rbfiles, base: "lib")      #=> ["song.rb",
                                    #    "song/karaoke.rb"]

libdirs = File.join("**", "lib")
Dir.glob(libdirs)                   #=> ["lib"]

librbfiles = File.join("**", "lib", "**", "*.rb")
Dir.glob(librbfiles)                #=> ["lib/song.rb",
                                    #    "lib/song/karaoke.rb"]

librbfiles = File.join("**", "lib", "*.rb")
Dir.glob(librbfiles)                #=> ["lib/song.rb"]

انظر أيضًا

  • صفحة الصنف Dir.

مصادر