هذا هو الأمر perlclib الذي يمكن تشغيله في موفر الاستضافة المجاني OnWorks باستخدام إحدى محطات العمل المجانية المتعددة عبر الإنترنت مثل Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت
برنامج:
اسم
perlclib - البدائل الداخلية لوظائف مكتبة C القياسية
الوصف
شيء واحد يجب أن يلاحظه حمالو بيرل هو ذلك بيرل لا يميل إلى استخدام الكثير من C
المكتبة القياسية داخليًا؛ سترى استخدامًا قليلًا جدًا، على سبيل المثال، لـ ctype.h
وظائف هناك. وذلك لأن لغة Perl تميل إلى إعادة تنفيذ المكتبة القياسية أو تجريدها
الوظائف، حتى نعرف بالضبط كيف ستعمل.
هذه بطاقة مرجعية للأشخاص الذين هم على دراية بمكتبة C والذين يريدون القيام بذلك
الأشياء بطريقة بيرل؛ لإخبارهم بالوظائف التي يجب عليهم استخدامها بدلاً من المزيد
وظائف C العادية.
الاتفاقيات
في الجداول التالية:
"ر"
هو نوع.
"ص"
هو مؤشر.
"ن"
هو رقم.
"P"
عبارة عن سلسلة.
تمثل "sv" و"av" و"hv" وما إلى ذلك متغيرات من أنواعها.
قم بتقديم العمليات
بدلا من ال stdio.h وظائف، يجب عليك استخدام طبقة تجريد بيرل. بدلاً من
أنواع "FILE*"، يجب أن تتعامل مع أنواع "PerlIO*". ولا تنسوا ذلك مع الجديد
قد لا تكون أنواع تجريد الإدخال/الإخراج ذات الطبقات PerlIO "FILE*" متاحة. أنظر أيضاً
وثائق "perlapio" لمزيد من المعلومات حول الوظائف التالية:
بدلاً من: استخدم:
ستدين بيرليو_stdin()
ستدوت بيرليو_stdout()
ستدير بيرليو_stderr()
fopen(fn, الوضع) PerlIO_open(fn, الوضع)
freopen(fn, mode,stream) PerlIO_reopen(fn, mode, perlio) (Dep-
مكرر)
fflush (تيار) PerlIO_flush (بيرليو)
fإغلاق (تيار) بيرليو_إغلاق (بيرليو)
قم بتقديم إدخال و الناتج
بدلاً من: استخدم:
fprintf(stream, fmt, ...) PerlIO_printf(perlio, fmt, ...)
[f]getc(تيار) PerlIO_getc(perlio)
[f]putc(stream, n) PerlIO_putc(perlio, n)
ungetc(n, تيار) PerlIO_ungetc(perlio, n)
لاحظ أن معادلات PerlIO لـ "fread" و"fwrite" تختلف قليلًا عن تلك الخاصة بها
نظيراتها في مكتبة C:
fread(p, size, n,stream) PerlIO_read(perlio, buf, numbytes)
fwrite(p, size, n,stream) PerlIO_write(perlio, buf, numbytes)
fputs(s, تيار) PerlIO_puts(perlio, s)
لا يوجد ما يعادل "fgets"؛ يجب على المرء استخدام "sv_gets" بدلاً من ذلك:
fgets(s, n, تيار) sv_gets(sv, perlio, إلحاق)
قم بتقديم وضع
بدلاً من: استخدم:
feof(تيار) PerlIO_eof(بيرليو)
fseek(تيار، n، من أين) PerlIO_seek(perlio، n، من أين)
ترجيع (تيار) PerlIO_rewind (بيرليو)
fgetpos(stream, p) PerlIO_getpos(perlio, sv)
fsetpos(stream, p) PerlIO_setpos(perlio, sv)
فير (تيار) بيرليو_خطأ (بيرليو)
كليرير (تيار) بيرليو_كليرير (بيرليو)
ذاكرة الإدارة و خيط معالجة
بدلاً من: استخدم:
ر* ع = مالوك(ن) نيوكس(ع، ن، ر)
t* p = calloc(n, s) Newxz(p, n, t)
ع = realloc(p, n) تجديد(p, n, t)
memcpy(dst, src, n) نسخ(src, dst, n, t)
نقل (dst، src، n) نقل (src، dst، n، t)
memcpy(dst, src, sizeof(t)) StructCopy(src, dst, t)
memset(dst, 0, n * sizeof(t)) صفر(dst, n, t)
memzero(dst, 0) صفر(dst, n, char)
مجاني(ع) آمن(ع)
ستردوب(ع) سافيبف(ع)
strndup(p, n) savepvn(p, n) (مرحبًا، strndup لا يفعل ذلك
يخرج!)
strstr (كبير، صغير) instr (كبير، صغير)
strcmp(s1, s2) strLE(s1, s2) / strEQ(s1, s2)
/ سترجت(s1,s2)
strncmp(s1, s2, n) strnNE(s1, s2, n) / strnEQ(s1, s2, n)
memcmp(p1, p2, n) memNE(p1, p2, n)
!memcmp(p1, p2, n) memEQ(p1, p2, n)
لاحظ اختلاف ترتيب وسيطات "النسخ" و"النقل" عن الترتيب المستخدم في "memcpy" و
"ذكر".
ومع ذلك، في معظم الأوقات، ستحتاج إلى التعامل مع SVs داخليًا بدلاً من التعامل معها بشكل خام
سلاسل "شار *":
سترلين (ق) sv_len (sv)
strcpy(dt, src) sv_setpv(sv, s)
strncpy(dt, src, n) sv_setpvn(sv, s, n)
strcat(dt, src) sv_catpv(sv, s)
strncat(dt, src) sv_catpvn(sv, s)
sprintf(s, fmt, ...) sv_setpvf(sv, fmt, ...)
لاحظ أيضًا وجود "sv_catpvf" و"sv_vcatpvfn"، حيث يتم دمج التسلسل مع
التنسيق.
في بعض الأحيان بدلاً من تصفير الكومة المخصصة باستخدام نيوكسز() يجب ان تراعي
"تسميم" البيانات. وهذا يعني كتابة نمط صغير فيه والذي يجب أن يكون غير قانوني
المؤشرات (وأرقام الفاصلة العائمة)، ونأمل أيضًا أن تكون مفاجئة بدرجة كافية كأعداد صحيحة،
لذا فإن أي كود يحاول استخدام البيانات دون تفكير سوف يتعطل عاجلاً بدلاً من ذلك
من وقت لاحق. يمكن أن يتم التسمم باستخدام سم() وحدات الماكرو، التي لها وسيطات مماثلة
إلى صفر():
PoisonWith(dst, n, t, b) ذاكرة خربشة بالبايت ب
PoisonNew(dst, n, t) يساوي PoisonWith(dst, n, t, 0xAB)
PoisonFree(dst, n, t) يساوي PoisonWith(dst, n, t, 0xEF)
السم (dst، n، t) يساوي PoisonFree (dst، n، t)
حرف الفئه اختبارات
هناك عدة أنواع من اختبارات فئة الأحرف التي تنفذها لغة Perl. الوحيدين
الموصوفة هنا هي تلك التي تتوافق بشكل مباشر مع وظائف مكتبة C التي تعمل عليها
أحرف 8 بت، ولكن هناك مرادفات تعمل على أحرف واسعة، وUTF-8
سلاسل مشفرة. تم وصفها جميعًا بشكل كامل في "تصنيف الشخصيات" في perlapi
و"تغيير حالة الأحرف" في perlapi.
تقوم إجراءات مكتبة C المدرجة في الجدول أدناه بإرجاع القيم بناءً على التيار
لغة. استخدم الإدخالات الموجودة في العمود الأخير لهذه الوظيفة. الآخران
تفترض الأعمدة دائمًا لغة POSIX (أو C). الإدخالات الموجودة في عمود ASCII هي فقط
ذات معنى لمدخلات ASCII، وإرجاع FALSE لأي شيء آخر. استخدم هذه فقط عندما
علم ذلك ما تريده. تفترض الإدخالات الموجودة في العمود Latin1 أن الأحرف غير ASCII
الأحرف ذات 8 بت هي كما يحددها Unicode، وهي نفس ISO-8859-1، وغالبًا ما تسمى باللاتينية
1.
بدلاً من: استخدم لـ ASCII: استخدم لـ Latin1: استخدم للغة:
isalnum(c) isALPHANUMERIC(c) isALPHANUMERIC_L1(c) isALPHANUMERIC_LC(c)
isalpha(ج) isALPHA(c) isALPHA_L1(c) isALPHA_LC(u )
isascii(c) isASCII(c) isASCII_LC(c)
فارغة(ج) فارغة(ج) فارغة_L1(ج) فارغة_LC(ج)
iscntrl(c) isCNTRL(c) isCNTRL_L1(c) isCNTRL_LC(c)
isdigit(c) isDIGIT(c) isDIGIT_L1(c) isDIGIT_LC(c)
رسم بياني (ج) هوGRAPH(ج) هوGRAPH_L1(ج) هوGRAPH_LC(ج)
أقل(ج) isLOWER(ج) isLOWER_L1(ج) isLOWER_LC(ج)
isprint(c) isPRINT(c) isPRINT_L1(c) isPRINT_LC(c)
ispunct(c) isPUNCT(c) isPUNCT_L1(c) isPUNCT_LC(c)
isspace(c) isSPACE(c) isSPACE_L1(c) isSPACE_LC(c)
isupper(c) isUPPER(c) isUPPER_L1(c) isUPPER_LC(c)
isxdigit(c) isXDIGIT(c) isXDIGIT_L1(c) isXDIGIT_LC(c)
tolower(c) toLOWER(c) toLOWER_L1(c) toLOWER_LC(c)
toupper(c) إلىUPPER(c) toUPPER_LC(c)
للتأكيد على أنك تعمل فقط على أحرف ASCII، يمكنك إلحاق "_A" بكل منها
لوحدات الماكرو في عمود ASCII: "isALPHA_A"، و"isDIGIT_A"، وما إلى ذلك.
(لا يوجد إدخال في العمود Latin1 لـ "isascii" على الرغم من وجود
"isASCII_L1"، وهو مطابق لـ "isASCII"؛ الاسم الأخير أوضح. لا يوجد
إدخال في العمود Latin1 لـ "toupper" لأن النتيجة يمكن أن تكون غير Latin1. لديك
لاستخدام "toUPPER_uni"، كما هو موضح في "تغيير حالة الأحرف" في perlapi.)
stdlib.h وظائف
بدلاً من: استخدم:
اتوف (ق) اتوف (ق)
atoi(s) grok_atoUV(s, &uv, &e)
atol(s) grok_atoUV(s, &uv, &e)
strtod(s, &p) لا شيء. فقط لا تستخدمه.
strtol(s, &p, n) grok_atoUV(s, &uv, &e)
strtoul(s, &p, n) grok_atoUV(s, &uv, &e)
الاستخدام النموذجي هو إجراء فحوصات النطاق على "الأشعة فوق البنفسجية" قبل الإرسال:
كثافة العمليات أنا؛ الأشعة فوق البنفسجية؛ شار* end_ptr;
إذا (grok_atoUV(input, &uv, &end_ptr)
&& الأشعة فوق البنفسجية <= INT_MAX)
i = (int)uv;
... /* تابع التحليل من end_ptr */
{} آخر
... /* خطأ في التحليل: ليس عددًا صحيحًا عشريًا في النطاق 0 .. MAX_IV */
}
لاحظ أيضًا وظائف "grok_bin" و"grok_hex" و"grok_oct" في رقمي.ج لـ
تحويل السلاسل التي تمثل الأرقام في القواعد المعنية إلى "NV". لاحظ أن
grok_atoUV() لا يتعامل مع المدخلات السلبية أو المسافات البيضاء البادئة (يتم ذلك عن قصد
حازم).
نلاحظ أن سترتول () و سترتول() يمكن أن تكون متنكرة على أنها سترتول (), سترتول(), أتول(), أتول ().
تجنب تلك أيضا.
من الناحية النظرية، قد لا يتم تعريف "Strtol" و"Strtoul" إذا تم بناء لغة Perl على الآلة
لا يحتوي في الواقع على strtol وstrtoul. ولكن بما أن هاتين الوظيفتين جزء من 2
مواصفات ANSI C نعتقد أنك ستجدها في كل مكان الآن.
إنت راند () مزدوج Drand01 ()
srand(n) {seedDrand01((Rand_seed_t)n);
PL_srand_call = TRUE; }
خروج (ن) my_exit (ن)
النظام (الأنظمة) لا. انظر إلى pp_system أو استخدم my_popen.
getenv(s) PerlEnv_getenv(s)
setenv(s, val) my_setenv(s, val)
منوع وظائف
لا ينبغي لك حتى تريد لاستخدام setjmp.h الوظائف، ولكن إذا كنت تعتقد أنك تفعل ذلك، استخدم
مكدس "JMPENV". النطاق. ح بدلا من ذلك.
بالنسبة إلى "الإشارة"/"sigaction"، استخدم "rsignal(signo, Handler)".
استخدم perlclib عبر الإنترنت باستخدام خدمات onworks.net