هذا هو الأمر perlopentut الذي يمكن تشغيله في مزود الاستضافة المجانية OnWorks باستخدام إحدى محطات العمل المجانية المتعددة على الإنترنت مثل Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت
برنامج:
اسم
perlopentut - وصفات بسيطة لفتح الملفات والأنابيب في Perl
الوصف
عندما تقوم بإجراء الإدخال/الإخراج على ملف في Perl، فإنك تفعل ذلك من خلال ما يسمى في Perl بـ a
مقبض الملف. مقبض الملف هو اسم داخلي لملف خارجي. إنها وظيفة
وظيفة "فتح" للربط بين الاسم الداخلي والاسم الخارجي ،
ووظيفة وظيفة "الإغلاق" هي قطع هذا الارتباط.
من أجل راحتك، يقوم Perl بإعداد عدد قليل من معالجات الملفات الخاصة المفتوحة بالفعل
أنت تركض. وتشمل هذه "STDIN" و "STDOUT" و "STDERR" و "ARGV". لأن هؤلاء هم قبل-
تم فتحها ، يمكنك استخدامها على الفور دون الحاجة إلى تحمل عناء فتحها
نفسك:
طباعة STDERR "هذه رسالة تصحيح. \ n" ؛
طباعة STDOUT "الرجاء إدخال شيء:" ؛
استجابة دولار = // تموت "كيف لا يوجد إدخال؟" ؛
طباعة STDOUT "شكرًا لك! \ n" ؛
بينما ( ) {...}
كما ترى من هذه الأمثلة ، فإن "STDOUT" و "STDERR" عبارة عن مقابض إخراج ، و "STDIN" و
"ARGV" هي مقابض إدخال. كلها بأحرف كبيرة لأنها محجوزة لـ
Perl ، مثل المصفوفة ARGV @ و تجزئة٪ ENV. كانت ارتباطاتهم الخارجية
التي أنشأتها قوقعتك.
ستحتاج إلى فتح كل معالجات ملفات أخرى بنفسك. رغم أن هناك الكثير
المتغيرات ، الطريقة الأكثر شيوعًا لاستدعاء لغة Perl افتح() وظيفة مع ثلاث حجج و
قيمة إرجاع واحدة:
" OK = فتح (مقبض ، الوضع، اسم المسار)"
أين:
OK ستكون قيمة محددة إذا نجح الفتح ، ولكن "undef" إذا فشلت ؛
مقبض
يجب أن يكون متغيرًا قياسيًا غير محدد ليتم ملؤه بواسطة دالة "الفتح" إذا كانت كذلك
ينجح.
MODE
هو وضع الوصول وتنسيق الترميز لفتح الملف ؛
اسم المسار
هو الاسم الخارجي للملف الذي تريد فتحه.
يكمن معظم تعقيد الوظيفة "المفتوحة" في العديد من القيم المحتملة التي يكمن فيها
MODE يمكن أن تأخذ المعلمة.
شيء أخير قبل أن نوضح لك كيفية فتح الملفات: فتح الملفات لا (عادة)
قفلها تلقائيًا في Perl. انظر perlfaq5 لمعرفة كيفية القفل.
افتتاح نص ملفات
افتتاح نص ملفات لـ القراءة
إذا كنت تريد القراءة من ملف نصي ، فافتحه أولاً في وضع القراءة فقط كما يلي:
my $ filename = "/ بعض / المسار / إلى / a / textfile / يذهب / هنا" ؛
my $ encoding = ": encoding (UTF-8)"؛
مقبض $ الخاص بي = undef؛ # سيتم ملء هذا بالنجاح
مفتوح ($ handle، "<$ encoding"، $ filename)
|| يموت "$ 0: لا يمكن فتح $ filename للقراءة: $!"؛
كما هو الحال مع الصدفة ، في Perl ، يتم استخدام "<" لفتح الملف في وضع القراءة فقط. لو أنه
نجح ، تخصص Perl لك ملفًا جديدًا تمامًا وتملأ ملفك السابق
undefined $ handle وسيطة بإشارة إلى هذا المقبض.
يمكنك الآن استخدام وظائف مثل "readline" و "read" و "getc" و "sysread" على هذا المقبض.
ربما تكون وظيفة الإدخال الأكثر شيوعًا هي تلك التي تشبه عامل التشغيل:
$ line = readline (مقبض $) ؛
$ line = <$ handle> ؛ # نفس الشيء
لأن وظيفة "readline" ترجع "undef" في نهاية الملف أو عند حدوث خطأ ، ستفعل
أحيانًا انظر إليه مستخدمًا بهذه الطريقة:
$ line = <$ handle> ؛
إذا (سطر $ المحدد) {
# افعل شيئًا باستخدام $ line
}
آخر {
# $ line غير صالح ، فتخطه
}
يمكنك أيضًا "الموت" بسرعة على قيمة غير محددة بهذه الطريقة:
$ line = <$ handle> // die "لم يتم العثور على أي إدخال" ؛
ومع ذلك ، إذا كان ضرب EOF حدثًا متوقعًا وعاديًا ، فأنت لا تريد الخروج ببساطة
لأن المدخلات نفدت لديك. بدلاً من ذلك ، ربما تريد فقط الخروج من حلقة الإدخال.
يمكنك بعد ذلك اختبار لمعرفة ما إذا كان هناك خطأ فعلي تسبب في إنهاء الحلقة والعمل
وفقا لذلك:
بينما (<$ handle>) {
# افعل شيئًا ما بالبيانات بالدولار _
}
إذا ($!) {
die "خطأ غير متوقع أثناء القراءة من $filename: $!";
}
A ملاحظات on ترميزات: قد يبدو الاضطرار إلى تحديد ترميز النص في كل مرة أمرًا صعبًا إلى حد ما
يزعج. لإعداد ترميز افتراضي لـ "فتح" حتى لا تضطر إلى توفيره لكل منهما
الوقت ، يمكنك استخدام براغما "المفتوحة":
استخدم qw المفتوح <: encoding (UTF-8)> ؛
بمجرد القيام بذلك ، يمكنك حذف جزء الترميز من الوضع المفتوح بأمان:
فتح (مقبض $، "<"، اسم الملف $)
|| يموت "$ 0: لا يمكن فتح $ filename للقراءة: $!"؛
ولكن لا تستخدم مطلقًا "<" بدون إعداد التشفير الافتراضي أولاً. خلاف ذلك،
لا تستطيع Perl معرفة أي من النكهات العديدة والعديدة الممكنة للملف النصي لديك ، و
لن يكون لدى Perl أي فكرة عن كيفية تعيين البيانات بشكل صحيح في ملفك إلى أحرف فعلية
يمكنها العمل معها. تنسيقات التشفير الشائعة الأخرى بما في ذلك "ASCII" و "ISO-8859-1" ،
"ISO-8859-15" و "Windows-1252" و "MacRoman" وحتى "UTF-16LE". انظر perlunitut للمزيد
حول الترميزات.
افتتاح نص ملفات لـ الكتابة
عندما تريد الكتابة إلى ملف، عليك أولاً أن تقرر ما يجب فعله بشأن أي ملف موجود
محتويات هذا الملف. لديك خياران أساسيان هنا: الحفاظ أو الضرب.
إذا كنت تريد الاحتفاظ بأي محتويات موجودة ، فأنت تريد فتح الملف في الإلحاق
وضع. كما هو الحال في shell ، في Perl تستخدم ">>" لفتح ملف موجود في وضع الإلحاق.
ينشئ ">>" الملف إذا لم يكن موجودًا بالفعل.
مقبض $ الخاص بي = undef؛
my $ filename = "/ بعض / المسار / إلى / a / textfile / يذهب / هنا" ؛
my $ encoding = ": encoding (UTF-8)"؛
open ($ handle، ">> $ encoding"، $ filename)
|| يموت "$ 0: لا يمكن فتح $ filename للإلحاق: $!"؛
يمكنك الآن الكتابة إلى مقبض الملف هذا باستخدام أي من "print" أو "printf" أو "say" أو "write" أو
"syswrite".
كما هو مذكور أعلاه ، إذا لم يكن الملف موجودًا بالفعل ، فسيتم إنشاء وضع الإلحاق المفتوح
من أجلك. ولكن إذا كان الملف موجودًا بالفعل ، فإن محتوياته في مأمن من الأذى بسبب
ستضيف النص الجديد بعد نهاية النص القديم.
من ناحية أخرى، في بعض الأحيان تريد تحطيم كل ما قد يكون موجودًا بالفعل. ل
إفراغ ملف قبل البدء في الكتابة إليه ، يمكنك فتحه في وضع الكتابة فقط:
مقبض $ الخاص بي = undef؛
my $ filename = "/ بعض / المسار / إلى / a / textfile / يذهب / هنا" ؛
my $ encoding = ": encoding (UTF-8)"؛
فتح (مقبض $، "> ترميز $، اسم ملف $)
|| يموت "$ 0: لا يمكن فتح $ filename في وضع الكتابة المفتوحة: $!"؛
هنا مرة أخرى ، تعمل Perl تمامًا مثل الصدفة حيث تعمل ">" clobbers على ملف موجود.
كما هو الحال مع وضع الإلحاق ، عندما تفتح ملفًا في وضع الكتابة فقط ، يمكنك الآن الكتابة إليه
هذا الملف باستخدام أي من "طباعة" أو "printf" أو "قل" أو "كتابة" أو "syswrite".
ماذا عن وضع القراءة والكتابة؟ ربما يجب أن تتظاهر بأنها غير موجودة ، لأن الفتح
من غير المحتمل أن تفعل الملفات النصية في وضع القراءة والكتابة ما تريده. انظر perlfaq5 ل
تفاصيل.
افتتاح ثنائي ملفات
إذا كان الملف المراد فتحه يحتوي على بيانات ثنائية بدلاً من أحرف نصية ، فإن "الوضع"
حجة "فتح" مختلفة قليلا. بدلاً من تحديد الترميز ، كما تقول
Perl أن بياناتك بالبايت الخام.
my $ filename = "/ بعض / مسار / إلى / a / ثنائي / ملف / يذهب / هنا" ؛
ترميز $ الخاص بي = ": خام: بايت"
مقبض $ الخاص بي = undef؛ # سيتم ملء هذا بالنجاح
ثم افتح كما كان من قبل ، واختر "<" أو ">>" أو ">" حسب الحاجة:
مفتوح ($ handle، "<$ encoding"، $ filename)
|| يموت "$ 0: لا يمكن فتح $ filename للقراءة: $!"؛
open ($ handle، ">> $ encoding"، $ filename)
|| يموت "$ 0: لا يمكن فتح $ filename للإلحاق: $!"؛
فتح (مقبض $، "> ترميز $، اسم ملف $)
|| يموت "$ 0: لا يمكن فتح $ filename في وضع الكتابة المفتوحة: $!"؛
بالتناوب ، يمكنك التغيير إلى الوضع الثنائي على مقبض موجود بهذه الطريقة:
binmode ($ handle) || يموت "لا يمكن التعامل مع binmode" ؛
هذا مفيد بشكل خاص للمقابض التي فتحتها لك Perl بالفعل.
binmode (STDIN) || يموت "لا يمكن binmode STDIN" ؛
binmode (STDOUT) || يموت "لا يمكن binmode STDOUT" ؛
يمكنك أيضًا تمرير "binmode" ترميزًا صريحًا لتغييره سريعًا. هذا ليس كذلك
الوضع "الثنائي" بالضبط ، لكننا ما زلنا نستخدم "binmode" للقيام بذلك:
binmode (STDIN، ": encoding (MacRoman)") || يموت "لا يمكن binmode STDIN" ؛
binmode (STDOUT، ": encoding (UTF-8)") || يموت "لا يمكن binmode STDOUT" ؛
بمجرد فتح ملفك الثنائي بشكل صحيح في الوضع الصحيح، يمكنك استخدام كل نفس
وظائف Perl I / O كما استخدمتها في الملفات النصية. ومع ذلك ، قد ترغب في استخدام الحجم الثابت
"read" بدلاً من "readline" متغير الحجم لإدخالك.
فيما يلي مثال على كيفية نسخ ملف ثنائي:
BUFSIZ دولار الخاص بي = 64 * (2 ** 10) ؛
my $ name_in = "/ some / input / file" ؛
my $ name_out = "/ some / output / flie" ؛
($ in_fh، $ out_fh، $ buffer)؛
open ($ in_fh، "<"، $ name_in)
|| يموت "$ 0: لا يمكن فتح $ name_in لقراءة: $!"؛
فتح ($ out_fh، ">"، $ name_out)
|| يموت "$ 0: لا يمكن فتح $ name_out للكتابة: $!"؛
من أجل $ fh ($ in_fh ، $ out_fh) {
binmode ($ fh) || يموت "فشل binmode" ؛
}
while (read ($ in_fh، $ buffer، $ BUFSIZ)) {
ما لم (اطبع $out_fh $buffer) {
يموت "لا يمكن الكتابة إلى $ name_out: $!" ؛
}
}
اغلاق ($ in_fh) || يموت "لا يمكن إغلاق $ name_in: $!" ؛
اغلاق ($ out_fh) || يموت "لا يمكن إغلاق $ name_out: $!" ؛
افتتاح أنابيب
سوف يتم الاعلان عنه.
مستوى منخفض قم بتقديم يفتح بواسطة com.sysopen
سوف يتم الاعلان عنه. أو حذفها.
استخدم perlopentut عبر الإنترنت باستخدام خدمات onworks.net