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

من موسوعة حسوب
< Ruby‏ | Dir
لا ملخص تعديل
لا ملخص تعديل
سطر 69: سطر 69:
== أمثلة ==
== أمثلة ==
مثال عن استخدام التابع <code>glob</code> على المجلد <code>testdir</code> الذي يحتوي ملفين عاديين (<code>config.h</code> و <code>main.rb</code>) ، والمجلد الأب (<code>..</code>) ، والمجلد نفسه (<code>.</code>).<syntaxhighlight lang="ruby">
مثال عن استخدام التابع <code>glob</code> على المجلد <code>testdir</code> الذي يحتوي ملفين عاديين (<code>config.h</code> و <code>main.rb</code>) ، والمجلد الأب (<code>..</code>) ، والمجلد نفسه (<code>.</code>).<syntaxhighlight lang="ruby">
Dir.each_child("testdir") {|x| puts "Got #{x}" }
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"]


</syntaxhighlight>سينتج:<syntaxhighlight lang="ruby">
Got config.h
Got main.rb
</syntaxhighlight>
</syntaxhighlight>
== أنظر أيضًا ==
== أنظر أيضًا ==
* صفحة الصنف <code>[[Ruby/Dir|Dir]]</code>.
* صفحة الصنف <code>[[Ruby/Dir|Dir]]</code>.
* التابع <code>[[Ruby/Dir/foreach|foreach]]</code>: يستدعي التابع <code>glob</code> الكتلة المعطاة على كل ملف من الملفات المحتواة في المجلد المحدد باستثناء "<code>..</code>" و "<code>.</code>". حيث يمُمرّر أسماء تلك الملفات كوسائط للكتلة. 


== مصادر ==
== مصادر ==
* [http://ruby-doc.org/core-2.5.1/Dir.html#method-c-each_child قسم  التابع glob  في الصنف Dir في توثيق روبي الرسمي.]
* [http://ruby-doc.org/core-2.5.1/Dir.html#method-c-glob قسم  التابع glob  في الصنف Dir في توثيق روبي الرسمي.]

مراجعة 16:42، 23 سبتمبر 2018

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

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

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

تعتمد الحساسية لحالة الحروف (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 click to toggle source
glob( pattern, [flags], [base: path] ) { |filename| block }  nil

المعاملات

pattern

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

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.

مصادر