هذا هو الأمر perlfaq7 الذي يمكن تشغيله في مزود الاستضافة المجانية OnWorks باستخدام إحدى محطات العمل المجانية المتعددة على الإنترنت مثل Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت
برنامج:
اسم
perlfaq7 - مشكلات لغة بيرل العامة
VERSION
إصدار 5.021009
الوصف
يتعامل هذا القسم مع مشكلات لغة Perl العامة التي لا تتناسب بشكل واضح مع أي منها
الأقسام الأخرى.
يستطيع I دولار فقط واحصل على خصم XNUMX% على جميع a بي إن إف/ياك/ري لـ القادم بيرل لغة؟
لا يوجد BNF، ولكن يمكنك شق طريقك من خلال قواعد yacc في perly.y في
توزيع المصدر إذا كنت شجاعًا بشكل خاص. القواعد تعتمد على ذكية جدا
رمز الترميز، لذا كن مستعدًا للمغامرة في toke.c أيضًا.
على حد تعبير حاييم فرنكل: "لا يمكن اختزال قواعد لغة بيرل في BNF. إن عمل بيرل
يتم توزيع تحليل بيرل بين yacc، وLexer، والدخان والمرايا.
ابحث عن . الكل هؤلاء $@%&* علامات ترقيم علامات، و كيف do I علم متى إلى تستخدم معهم؟
وهي محددات النوع، كما هو مفصل في perldata:
$ للقيم العددية (رقم أو سلسلة أو مرجع)
@ للمصفوفات
% للتجزئات (المصفوفات الترابطية)
وللإجراءات الفرعية (المعروفة أيضًا باسم الوظائف والإجراءات والأساليب)
* لجميع أنواع اسم الرمز هذا. في الإصدار 4 استخدمتها مثل
المؤشرات، ولكن في Perls الحديثة يمكنك فقط استخدام المراجع.
هناك بعض الرموز الأخرى التي من المحتمل أن تواجهها والتي ليست حقيقية
محددات النوع:
<> تستخدم لإدخال سجل من مقبض الملف.
\ يأخذ إشارة إلى شيء ما.
لاحظ أن يكون او محدد النوع للملفات ولا اسم المقبض. إنها
تم تطبيق عامل التشغيل "<>" على ملف المقبض. يقرأ سطرًا واحدًا (حسنًا، سجل--انظر "$/" في
perlvar) من ملف المقبض في سياق العددي، أو الكل الخطوط في سياق القائمة. متى
إجراء عملية فتح أو إغلاق أو أي عملية أخرى غير "<>" على الملفات، أو حتى عند التحدث
حول المقبض، افعل ليست استخدم الأقواس. هذه صحيحة: "eof(FH)"، "seek(FH, 0, 2)"
و"النسخ من STDIN إلى FILE".
Do I دائما أبدا لديك إلى اقتبس my سلاسل or تستخدم فاصلة منقوطة و الفواصل؟
في العادة، لا يلزم اقتباس الكلمات المكشوفة، ولكن في معظم الحالات ربما ينبغي أن تكون (و
يجب أن يكون ضمن "استخدام صارم"). ولكن مفتاح التجزئة يتكون من كلمة بسيطة واليد اليسرى
يتم احتساب المعامل إلى عامل التشغيل "=>" كما لو تم اقتباسهما:
هذا مثل هذا
------------ ---------------
$foo{line} $foo{'line'}
شريط => أشياء 'شريط' => أشياء
الفاصلة المنقوطة الأخيرة في الكتلة اختيارية، كما هو الحال مع الفاصلة الأخيرة في القائمة. أسلوب جيد
(انظر perlstyle ) يقول لوضعها باستثناء الخطوط الفردية:
إذا ($ يصيح) { خروج 1 }
@nums = (1, 2, 3);
إذا (يصيح) {
خروج 1 ؛
}
@خطوطي = (
"هناك جاءت بيرين من الجبال الباردة"،
"وتاه وهو يتجول تحت أوراق الشجر"
);
كيفية do I تخطى بعض عائد أعلى القيم؟
إحدى الطرق هي التعامل مع القيم المرجعة كقائمة والفهرسة فيها:
$dir = (getpwnam($user))[7];
هناك طريقة أخرى وهي استخدام undef كعنصر على الجانب الأيسر:
($dev, $ino, undef, undef, $uid, $gid) = stat($file);
يمكنك أيضًا استخدام شريحة قائمة لتحديد العناصر التي تحتاجها فقط:
($dev, $ino, $uid, $gid) = ( stat($file) )[0,1,4,5];
كيفية do I مؤقتا منع تحذيرات؟
إذا كنت تستخدم الإصدار 5.6.0 من Perl أو إصدارًا أحدث، فإن براغما "استخدام التحذيرات" تسمح بالتحكم الدقيق في
ما هي التحذيرات التي يتم إنتاجها. راجع بيرليكسوارن لمزيد من التفاصيل.
{
لا تحذيرات. # إيقاف التحذيرات مؤقتًا
$x = $y + $z; # أعلم أن هذه قد تكون غير محددة
}
بالإضافة إلى ذلك، يمكنك تمكين وتعطيل فئات التحذيرات. قمت بإيقاف تشغيل
الفئات التي تريد تجاهلها، ولا يزال بإمكانك الحصول على فئات أخرى من التحذيرات. يرى
perllexwarn للحصول على التفاصيل الكاملة، بما في ذلك أسماء الفئات والتسلسل الهرمي.
{
لا توجد تحذيرات "غير مهيأة"؛
$x = $y + $z;
}
إذا كان لديك إصدار أقدم من Perl، فسيتحكم المتغير $^W (الموثق في perlvar).
تحذيرات وقت التشغيل للكتلة:
{
محلي $^W = 0; # إيقاف التحذيرات مؤقتًا
$x = $y + $z; # أعلم أن هذه قد تكون غير محددة
}
لاحظ أنه مثل جميع متغيرات علامات الترقيم، لا يمكنك استخدامها حاليًا لي() على $^W، فقط
محلي().
ما هو an تمديد؟
الامتداد هو وسيلة لاستدعاء كود C المترجم من Perl. قراءة بيرلكسستوت أمر جيد
مكان لمعرفة المزيد عن الإضافات.
لماذا do بيرل مشغلي لديك مختلف الأولوية من C العاملين؟
في الواقع، لا يفعلون ذلك. جميع عوامل تشغيل لغة C التي تنسخها لغة Perl لها نفس الأسبقية في لغة Perl
يفعلون ذلك في لغة C. المشكلة تكمن في عوامل التشغيل التي لا تتوفر في لغة C، وخاصة الوظائف التي
إعطاء سياق قائمة لكل شيء على حقهم، على سبيل المثال. الطباعة، chmod، exec، وما إلى ذلك. هذه
تسمى الوظائف "عوامل تشغيل القائمة" وتظهر على هذا النحو في جدول الأسبقية في
perlop.
من الأخطاء الشائعة كتابة:
قم بإلغاء ربط ملف $ || يموت "اللخبطة" ؛
يتم تفسير ذلك على النحو التالي:
إلغاء الارتباط ($ملف || يموت "snafu");
لتجنب هذه المشكلة، قم بوضع أقواس إضافية أو استخدم الأسبقية المنخفضة جدًا
عامل التشغيل "أو":
(فك ربط الملف $) || يموت "اللخبطة" ؛
قم بإلغاء ربط ملف $ أو تموت "snafu";
عوامل التشغيل "الإنجليزية" ("و" و"أو" و"xor" و"ليس") لها أسبقية أقل عمدًا
من مشغلي القائمة لمثل هذه المواقف مثل تلك المذكورة أعلاه.
عامل آخر ذو أسبقية مدهشة هو الأسي. إنه يربط بشكل أكثر إحكامًا
من سالب أحادي، مما يجعل "-2**2" ينتج سالب أربعة وليس موجبًا. إنها
وأيضًا ربط لليمين، مما يعني أن "2**3**2" يساوي اثنين مرفوعًا للأس التاسعة، وليس ثمانية
مربعة.
على الرغم من أن له نفس الأسبقية كما هو الحال في لغة C، إلا أن عامل التشغيل "?:" الخاص بـ Perl ينتج قيمة l. هذا
يعين $x إما $if_true أو $if_false، اعتمادًا على صحة $maybe:
($ربما؟ $if_true : $if_false) = $x;
كيفية do I أعلن/إنشاء a بنية؟
بشكل عام، أنت لا "تعلن" عن هيكل. فقط استخدم تجزئة (ربما مجهولة).
مرجع. راجع perlref وperldsc للحصول على التفاصيل. هنا مثال:
$شخص = {}; # تجزئة مجهولة جديدة
$شخص->{AGE} = 24; # قم بتعيين الحقل AGE إلى 24
$person->{NAME} = "نات"; # قم بتعيين اسم الحقل على "Nat"
إذا كنت تبحث عن شيء أكثر صرامة، فجرّب perlootut.
كيفية do I خلق a وحدة؟
يعد perlnewmod مكانًا جيدًا للبدء، فتجاهل الأجزاء المتعلقة بالتحميل إلى CPAN إذا لم تقم بذلك
تريد جعل الوحدة الخاصة بك متاحة للجمهور.
ExtUtils::ModuleMaker وModule::Starter هما أيضًا مكانان جيدان للبدء. العديد من مؤلفي CPAN
استخدم الآن Dist::Zilla لأتمتة أكبر قدر ممكن.
يمكن العثور على الوثائق التفصيلية حول الوحدات على: perlmod، perlmodlib، perlmodstyle.
إذا كنت بحاجة إلى تضمين كود C أو واجهات مكتبة C، فاستخدم h2xs. سيقوم h2xs بإنشاء ملف
هيكل توزيع الوحدة وملفات الواجهة الأولية. بيرلكس و بيرلكسستوت
شرح التفاصيل.
كيفية do I تبنى or أخذ على مدى a وحدة سابقا on CPA؟
اطلب من المشرف الحالي أن يجعلك مشرفًا مشاركًا أو ينقل الوحدة إليك.
إذا لم تتمكن من الوصول إلى المؤلف لسبب ما، فاتصل بمسؤولي PAUSE على
وحدات@perl.org الذين قد يكونون قادرين على المساعدة، ولكن يتم التعامل مع كل حالة على حدة.
· احصل على تسجيل دخول لخادم تحميل Perl Authors (PAUSE) إذا لم يكن لديك واحد بالفعل:
<http://pause.perl.org>
· اكتب ل وحدات@perl.org موضحًا ما فعلته للاتصال بالمشرف الحالي.
سيحاول مسؤولو PAUSE أيضًا الوصول إلى المشرف.
· قم بنشر رسالة عامة في أحد المواقع التي يتم الإتجار بها بكثافة تعلن فيها عن نيتك في الاستلام
على الوحدة.
· انتظر قليلا. لا يريد مسؤولو PAUSE التصرف بسرعة كبيرة في حالة الوضع الحالي
المشرف في إجازة. في حالة عدم الرد على الاتصالات الخاصة أو
منشور عام، يمكن لمسؤول PAUSE نقله إليك.
كيفية do I خلق a صف دراسي؟
(ساهم بها بريان د فوي)
في لغة Perl، الفصل هو مجرد حزمة، والطرق هي مجرد إجراءات فرعية. بيرل لا يحصل
أكثر رسمية من ذلك ويتيح لك إعداد الحزمة بالطريقة التي تريدها (ذلك
هو أنه لا يقوم بإعداد أي شيء لك).
راجع أيضًا perlootut، وهو برنامج تعليمي يغطي إنشاء الفصل الدراسي، وperlobj.
كيفية يمكن I اقول if a متغير is ملوث؟
يمكنك استخدام ملوثة () وظيفة وحدة Scalar::Util المتوفرة من CPAN (أو
مضمن مع Perl منذ الإصدار 5.8.0). انظر أيضًا "غسل البيانات الملوثة والكشف عنها"
في بيرلسيك.
ما هو a إنهاء؟
تم توثيق عمليات الإغلاق في perlref.
إغلاق هو مصطلح في علوم الكمبيوتر له معنى دقيق ولكن يصعب تفسيره. عادة،
يتم تنفيذ عمليات الإغلاق في لغة Perl كإجراءات فرعية مجهولة مع إشارات دائمة إليها
المتغيرات المعجمية خارج نطاقها الخاص. تشير هذه المفردات بطريقة سحرية إلى
المتغيرات التي كانت موجودة عندما تم تعريف الروتين الفرعي (الربط العميق).
تُستخدم عمليات الإغلاق غالبًا في لغات البرمجة حيث يمكنك الحصول على القيمة المرجعة
من وظيفة تكون في حد ذاتها وظيفة، كما يمكنك في بيرل. لاحظ أن بعض اللغات توفر
وظائف مجهولة ولكنها غير قادرة على توفير عمليات الإغلاق المناسبة: لغة بايثون،
على سبيل المثال. لمزيد من المعلومات حول عمليات الإغلاق، راجع أي كتاب مدرسي عن الوظائف
برمجة. Scheme هي لغة لا تدعم عمليات الإغلاق فحسب، بل تشجعها أيضًا.
فيما يلي دالة كلاسيكية لتوليد الوظائف غير المغلقة:
add_function_generator الفرعي {
العودة الفرعية { التحول () + التحول () }؛
}
$add_sub = add_function_generator();
$sum الخاص بي = $add_sub->(4,5); # $ المبلغ هو 9 الآن.
تم إرجاع الروتين الفرعي المجهول بواسطة add_function_generator() ليس من الناحية الفنية الإغلاق
لأنه لا يشير إلى معجم خارج نطاقه. باستخدام إغلاق يمنحك
وظيفة قالب مع ترك بعض فتحات التخصيص ليتم ملؤها لاحقًا.
قارن هذا بما يلي make_adder() وظيفة، والتي عاد مجهول
تحتوي الدالة على إشارة إلى متغير معجمي خارج نطاق تلك الوظيفة
بحد ذاتها. يتطلب مثل هذا المرجع أن يقوم Perl بإرجاع الإغلاق المناسب، وبالتالي قفله
في كل الأوقات القيمة التي كانت للمعجم عند إنشاء الوظيفة.
فرعي make_adder {
addpiece $ الخاص بي = Shift;
العودة الفرعية {shift() + $addpiece };
}
بلدي $f1 = make_adder(20)
بلدي $f2 = make_adder(555)
الآن "$f1->($n)" يساوي دائمًا 20 بالإضافة إلى $n الذي تقوم بتمريره، بينما يكون "$f2->($n)" دائمًا
555 بالإضافة إلى أي $n تقوم بتمريره. القطعة الإضافية $ الموجودة في الإغلاق تظل موجودة.
غالبًا ما يتم استخدام عمليات الإغلاق لأغراض أقل خصوصية. على سبيل المثال، عندما تريد المرور
القليل من التعليمات البرمجية في وظيفة:
خط $ الخاص بي ؛
المهلة (30، الفرعية {$line = } );
إذا تم تمرير التعليمات البرمجية المطلوب تنفيذها كسلسلة، فإن '$line = "، سيكون هناك
لم يكن هناك وسيلة للافتراضية نفذ الوقت() وظيفة للوصول إلى المتغير المعجمي $line
مرة أخرى في نطاق المتصل.
استخدام آخر للإغلاق هو عمل متغير خاص إلى روتين فرعي مسمى، على سبيل المثال أ
العداد الذي تتم تهيئته في وقت إنشاء القسم الفرعي ولا يمكن تعديله إلا من
داخل الباطن. يتم استخدام هذا أحيانًا مع كتلة BEGIN في ملفات الحزمة للتأكد من أ
لا يتم التدخل في المتغير خلال عمر الحزمة:
ابدأ {
معرف $ الخاص بي = 0؛
sub next_id { ++$id }
}
تمت مناقشة هذا بمزيد من التفصيل في perlsub؛ انظر الإدخال على مستمر خاص
المتغيرات.
ابحث عن is متغير انتحار و كيف يمكن I منع ذلك؟
تم إصلاح هذه المشكلة في Perl 5.004_05، لذا فإن منعها يعني ترقية الإصدار الخاص بك
بيرل. ;)
الانتحار المتغير هو عندما تفقد (بشكل مؤقت أو دائم) قيمة المتغير. هو - هي
يحدث بسبب النطاق من خلال لي() و محلي() التفاعل مع عمليات الإغلاق أو الأسماء المستعارة
foreach () متغيرات التكرار ووسائط الروتين الفرعي. كان من السهل أن يكون عن غير قصد
تفقد قيمة المتغير بهذه الطريقة، ولكن الآن أصبح الأمر أصعب بكثير. خذ هذا الكود:
بلدي $f = 'foo';
فرعي {
while ($i++ < 3) { my $f = $f; $f .= "شريط"; اطبع $f, "\n" }
}
T;
طباعة "أخيرًا $f\n";
إذا كنت تعاني من انتحار متغير، فإن "my $f" في الروتين الفرعي لا يلتقط أ
نسخة جديدة من $f وقيمتها "foo". يظهر الإخراج أنه داخل الروتين الفرعي
تتسرب قيمة $f عندما لا ينبغي لها ذلك، كما في هذا الإخراج:
فوبار
com.foobarbar
com.foobarbarbar
وأخيرا فو
يجب أن يكون $f الذي تمت إضافة "bar" إليه ثلاث مرات هو $f جديد يجب أن ينشئ "my $f" ملفًا
متغير معجمي جديد في كل مرة خلال الحلقة. الناتج المتوقع هو :
فوبار
فوبار
فوبار
وأخيرا فو
كيفية يمكن I تمرير/العودة a {وظيفة، مقبض الملف, مجموعة مصفوفة، التجزئة، طريقة، التعبير العادي}؟
تحتاج إلى تمرير المراجع إلى هذه الكائنات. راجع "التمرير حسب المرجع" في perlsub لهذا الغرض
سؤال خاص، وperlref للحصول على معلومات عن المراجع.
تمرير المتغيرات والوظائف
من السهل جدًا تمرير المتغيرات والوظائف العادية: ما عليك سوى تمرير إشارة إلى ملف
المتغير أو الوظيفة الموجودة أو المجهولة:
func(\$some_scalar);
func(\@some_array);
وظيفة( [ 1 .. 10 ] );
func(\%some_hash);
func( { this => 10, that => 20 } );
func(\&some_func);
func( sub { $_[0] ** $_[1] } );
تمرير مقابض الملفات
اعتبارًا من الإصدار Perl 5.6، يمكنك تمثيل معالجات الملفات بمتغيرات عددية يمكنك التعامل معها على أنها
أي عددية أخرى.
افتح $fh أو $filename أو مت "لا يمكن فتح $filename! $!";
وظيفة($fh);
الوظيفة الفرعية {
$passed_fh = Shift;
خط $ الخاص بي = <$passed_fh>;
}
قبل الإصدار 5.6 من Perl، كان عليك استخدام الرموز *FH أو "\*FH". هؤلاء هم
"typeglobs"--راجع "Typeglobs and Filehandles" في Perldata وخاصة "Pass by"
مرجع" في perlsub لمزيد من المعلومات.
تمرير التعابير المنطقية
فيما يلي مثال لكيفية تمرير سلسلة وتعبير عادي لمطابقتها
ضد. يمكنك إنشاء النموذج باستخدام عامل التشغيل "qr//":
مقارنة فرعية {
بلدي ($val1، $regex) = @_؛
$retval = $val1 =~ /$regex/;
إرجاع $retval؛
}
$match = Compare("old McDonald", qr/d.*D/i);
طرق التمرير
لتمرير أسلوب كائن إلى روتين فرعي، يمكنك القيام بذلك:
call_a_lot(10, $some_obj, "methname")
مكالمة فرعية_a_lot {
حسابي ($count, $widget, $trick) = @_;
لـ (my $i = 0; $i < $count; $i++) {
$القطعة->$trick();
}
}
أو يمكنك استخدام الإغلاق لتجميع الكائن واستدعاء الطريقة والوسائط الخاصة به:
my $whatnot = sub { $some_obj->obfuscate(@args) };
وظيفة($whatnot);
الوظيفة الفرعية {
كود $ الخاص بي = Shift;
&$كود();
}
يمكنك أيضًا التحقيق في يستطيع() الطريقة في الفئة UNIVERSAL (جزء من
توزيع بيرل القياسي).
كيفية do I خلق a ساكن عامل؟
(ساهم بها بريان د فوي)
في Perl 5.10، قم بتعريف المتغير باستخدام "الحالة". إعلان "الحالة" ينشئ
المتغير المعجمي الذي يستمر بين الاستدعاءات إلى الروتين الفرعي:
العداد الفرعي { الحالة $count = 1; $count++ }
يمكنك تزييف متغير ثابت باستخدام متغير معجمي يخرج عن النطاق. في
في هذا المثال، قمت بتعريف الروتين الفرعي "العداد"، ويستخدم المتغير المعجمي
عدد $. نظرًا لأنك قمت بتغليف هذا في كتلة BEGIN، فسيتم تعريف $count في وقت الترجمة، ولكن أيضًا
يخرج عن النطاق في نهاية كتلة BEGIN. تضمن كتلة BEGIN أيضًا أن
يتم تحديد الروتين الفرعي والقيمة التي يستخدمها في وقت الترجمة بحيث يكون الروتين الفرعي جاهزًا
استخدمه تمامًا مثل أي روتين فرعي آخر، ويمكنك وضع هذا الرمز في نفس المكان مثل أي روتين فرعي آخر
الإجراءات الفرعية في نص البرنامج (أي في نهاية الكود، عادةً). الروتين الفرعي
لا يزال "العداد" يحتوي على مرجع للبيانات، وهو الطريقة الوحيدة التي يمكنك من خلالها الوصول إلى القيمة
(وفي كل مرة تفعل ذلك، تزيد القيمة). البيانات الموجودة في جزء من الذاكرة المحددة بواسطة
$count خاص بـ "العداد".
ابدأ {
عدد دولاراتي = 1 ؛
العداد الفرعي { $count++ }
}
$start = counter();
.... # الكود الذي يستدعي العداد () ؛
نهاية $ = counter();
في المثال السابق، قمت بإنشاء متغير خاص بالوظيفة لأن دالة واحدة فقط
تذكرت مرجعها. يمكنك تحديد وظائف متعددة أثناء وجود المتغير
النطاق، ويمكن لكل وظيفة مشاركة المتغير "الخاص". انها ليست حقا "ثابتة"
لأنه يمكنك الوصول إليها خارج الوظيفة أثناء وجود المتغير المعجمي في النطاق، و
حتى إنشاء مراجع لذلك. في هذا المثال، يتم مشاركة "increment_count" و"return_count".
المتغير. تقوم إحدى الدالتين بإضافة القيمة والأخرى تقوم بإرجاع القيمة ببساطة. هم
يمكن لكليهما الوصول إلى $count، وبما أنه خرج عن النطاق، فلا توجد طريقة أخرى لذلك
الوصول إليه.
ابدأ {
عدد دولاراتي = 1 ؛
increment_count { $count++ }
عدد الإرجاع الفرعي { $count }
}
للإعلان عن متغير ملف خاص، لا تزال تستخدم متغيرًا معجميًا. الملف هو أيضا
النطاق، لذلك لا يمكن رؤية المتغير المعجمي المحدد في الملف من أي ملف آخر.
راجع "المتغيرات الخاصة الدائمة" في perlsub لمزيد من المعلومات. مناقشة
قد تساعدك عمليات الإغلاق في perlref على الرغم من أننا لم نستخدم إجراءات فرعية مجهولة في هذا
إجابة. راجع "المتغيرات الخاصة الدائمة" في perlsub للحصول على التفاصيل.
ما هو القادم فرق ما بين ديناميكي و معجمي (ثابتة) تحديد النطاق؟ ما بين محلي() و لي()?
"local($x)" يحفظ القيمة القديمة للمتغير العام $x ويعين قيمة جديدة لـ
مدة الروتين الفرعي التي is مرئي in أخرى وظائف تسمى تبدأ من أن
روتين. ويتم ذلك في وقت التشغيل، وهو ما يسمى بالنطاق الديناميكي. محلي() يؤثر دائما
المتغيرات العامة، وتسمى أيضًا متغيرات الحزمة أو المتغيرات الديناميكية.
يقوم "my($x)" بإنشاء متغير جديد يكون مرئيًا فقط في الروتين الفرعي الحالي. هذا هو
يتم إجراؤه في وقت الترجمة، لذلك يطلق عليه النطاق المعجمي أو الثابت. لي() يؤثر دائما
المتغيرات الخاصة، وتسمى أيضًا المتغيرات المعجمية أو (بشكل غير صحيح) ثابتة (محددة النطاق)
المتغيرات.
على سبيل المثال:
مرئية فرعية {
طباعة "var له قيمة $var\n";
}
ديناميكي فرعي {
محلي $var = 'local'; # قيمة مؤقتة جديدة لما لا يزال عالميًا
مرئي()؛ # متغير يسمى $var
}
معجم فرعي {
$var = 'private'; # متغير خاص جديد، $var
مرئي()؛ # (غير مرئي خارج النطاق الفرعي)
}
$var = 'عالمي';
مرئي()؛ # المطبوعات العالمية
متحرك()؛ # المطبوعات المحلية
معجمي(); # المطبوعات العالمية
لاحظ كيف لا تتم طباعة القيمة "خاصة" في أي وقت من الأوقات. ذلك لأن $var لديه فقط
تلك القيمة داخل كتلة معجمي () وظيفة، وكان مخفيا عن ما يسمى
روتين فرعي.
باختصار، محلي() لا يجعل ما تعتقد أنه متغيرات محلية خاصة. يعطي أ
المتغير العالمي قيمة مؤقتة. لي() هو ما تبحث عنه إذا كنت تريد الخصوصية
المتغيرات.
راجع "المتغيرات الخاصة عبر لي()" في perlsub و"القيم المؤقتة عبر محلي()" في بيرسوب
لتفاصيل مؤلمة
كيفية يمكن I الوصول a ديناميكي متغير في حين a وبالمثل عين معجمي is in نِطَاق؟
إذا كنت تعرف الحزمة الخاصة بك، فيمكنك فقط ذكرها بوضوح، كما في $Some_Pack::var. ملحوظة
أن التدوين $::var هو ليست الديناميكي $var في الحزمة الحالية، بل بالأحرى
واحد في الحزمة "الرئيسية"، كما لو كنت قد كتبت $main::var.
استخدم vars '$var'؛
محلي $var = "عالمي";
$var = "lexical";
طباعة "المعجمي هو $var\n";
طباعة "العالمية هي $main::var\n";
وبدلاً من ذلك يمكنك استخدام توجيه المترجم ملكنا() لإحضار متغير ديناميكي إلى
النطاق المعجمي الحالي.
تتطلب 5.006؛ # لدينا () لم تكن موجودة قبل 5.6
استخدم vars '$var'؛
محلي $var = "عالمي";
$var = "lexical";
طباعة "المعجمي هو $var\n";
{
لدينا $ فار؛
طباعة "العالمية هي $var\n";
}
ما هو القادم فرق ما بين عميق و ضحل ربط؟
في الربط العميق، تكون المتغيرات المعجمية المذكورة في الإجراءات الفرعية المجهولة هي نفسها
التي كانت في النطاق عند إنشاء الروتين الفرعي. في الارتباط الضحل، هم
أي متغيرات لها نفس الأسماء تكون في النطاق عندما يكون الروتين الفرعي
مُسَمًّى. يستخدم Perl دائمًا الربط العميق للمتغيرات المعجمية (أي تلك التي تم إنشاؤها باستخدام
لي()). ومع ذلك، فإن المتغيرات الديناميكية (المعروفة أيضًا باسم المتغيرات العالمية أو المحلية أو متغيرات الحزمة) هي كذلك
ملزمة بشكل سطحي بشكل فعال. اعتبر هذا سببًا آخر لعدم استخدامها. انظر
الإجابة على "ما هو الإغلاق؟".
لماذا لا "بلدي($فو) = <$fh>;" العمل حق؟
"my()" و"local()" يعطيان سياق القائمة على الجانب الأيمن من "=". قراءة <$fh>
يمكن للعملية، مثل العديد من وظائف ومشغلات Perl، معرفة السياق الذي كانت فيه
يتم استدعاؤه ويتصرف بشكل مناسب. بشكل عام، العددية() وظيفة يمكن أن تساعد. هذا
لا تفعل الوظيفة شيئًا للبيانات نفسها (خلافًا للأسطورة الشائعة) ولكنها تخبرها بدلاً من ذلك
حجة للتصرف بأي شكل من الأشكال العددية. إذا لم يكن لهذه الوظيفة
السلوك العددي المحدد، وهذا بالطبع لا يساعدك (مثل مع فرز()).
لفرض السياق العددي في هذه الحالة بالذات، تحتاج فقط إلى حذف
بين قوسين:
local($foo) = <$fh>; # خطأ
local($foo) = العددية(<$fh>); # نعم
محلي $foo = <$fh>; # يمين
ربما ينبغي عليك استخدام المتغيرات المعجمية على أي حال، على الرغم من أن المشكلة هي نفسها
، هنا:
my($foo) = <$fh>; # خطأ
بلدي $foo = <$fh>; # يمين
كيفية do I إعادة تعريف a المضمن وظيفة، المشغل أو العامل، or طريقة؟
لماذا تريد أن تفعل ذلك؟ :-)
إذا كنت تريد تجاوز وظيفة محددة مسبقًا، مثل افتح()، فسيتعين عليك الاستيراد
التعريف الجديد من وحدة مختلفة. راجع "تجاوز الوظائف المضمنة" في
com.perlsub.
إذا كنت تريد التحميل الزائد لمشغل Perl، مثل "+" أو "**"، فستحتاج إلى استخدام
براغما "استخدام التحميل الزائد"، موثقة في التحميل الزائد.
إذا كنت تتحدث عن حجب استدعاءات الأساليب في الفئات الأصل، فراجع "تجاوز الأساليب
وحل الطريقة" في perlootut.
ما هو القادم فرق ما بين دعوة a وظيفة as &foo و فو ()?
(ساهم بها بريان د فوي)
استدعاء روتين فرعي كـ &foo بدون أقواس زائدة يتجاهل النموذج الأولي لـ "foo"
ويمررها القيمة الحالية لقائمة الوسيطات، @_. هنا مثال؛ الحانة"
يستدعي الروتين الفرعي &foo، الذي يطبع قائمة الوسائط الخاصة به:
sub foo { print "الوسائط الموجودة في foo هي: @_\n"; }
الشريط الفرعي {&foo; }
شريط ("أ"، "ب"، "ج")؛
عند استدعاء "bar" مع الوسائط، ترى أن "foo" حصل على نفس @_:
الوسائط في foo هي: abc
لا يُستخدم استدعاء الروتين الفرعي بأقواس زائدة، مع أو بدون وسيطات
الحالي @_. تغيير المثال لوضع الأقواس بعد تغيير استدعاء "foo".
البرنامج:
sub foo { print "الوسائط الموجودة في foo هي: @_\n"; }
الشريط الفرعي { &foo(); }
شريط ("أ"، "ب"، "ج")؛
يُظهر الإخراج الآن أن "foo" لا يحصل على @_ من المتصل الخاص به.
الوسائط في foo هي:
ومع ذلك، فإن استخدام "&" في المكالمة لا يزال يتجاوز النموذج الأولي لـ "foo" إذا كان موجودًا:
sub foo ($$$) { print "Args infoo are: @_\n"; }
شريط فرعي_1 { &foo; }
شريط فرعي_2 { &foo(); }
sub bar_3 { foo( $_[0], $_[1], $_[2] ); }
# sub bar_4 { foo(); }
# bar_4 لا يتم تجميعه: "لا توجد وسائط كافية لـ main::foo at ..."
bar_1("أ"،"ب"،"ج")؛
# الوسائط في foo هي: abc
bar_2("أ"،"ب"،"ج")؛
# الوسائط في foo هي:
bar_3("أ"،"ب"،"ج")؛
# الوسائط في foo هي: abc
الاستخدام الرئيسي لميزة @_ التمريري هو كتابة الإجراءات الفرعية التي تكون وظيفتها الرئيسية
لاستدعاء إجراءات فرعية أخرى لك. لمزيد من التفاصيل، راجع بيرلسوب.
كيفية do I خلق a تحول or حقيبة بيان؟
في Perl 5.10، استخدم البنية "معطى-متى" الموصوفة في perlsyn:
استخدم 5.010 ؛
معين (سلسلة $) {
عندما ("فريد") { قل "لقد وجدت فريد!" }
عندما ("بارني") { قل "لقد وجدت بارني!" }
متى( /Bamm-?Bamm/ ) { قل "لقد وجدت Bamm-Bamm!" }
الافتراضي { قل "لا أعرف الاسم!" }
};
إذا أراد أحد استخدام لغة Perl النقية وأن يكون متوافقًا مع إصدارات Perl قبل الإصدار 5.10، فإن
الإجابة العامة هي استخدام "if-elsif-else":
لـ ($variable_to_test) {
إذا (/pat1/) { } # افعل شيئًا ما
elsif (/pat2/) { } # افعل شيئًا آخر
elsif (/pat3/) { } # افعل شيئًا آخر
آخر { } # افتراضي
}
فيما يلي مثال بسيط لمفتاح يعتمد على مطابقة الأنماط، ومصفوفًا بطريقة يمكن صنعها
يبدو أشبه ببيان التبديل. سنفعل شرطًا متعدد الطرق بناءً على النوع
المرجع المخزن في $whatchamacallit:
التبديل: لـ (المرجع $whatchamacallit) {
/^$/ && die "ليس مرجعًا";
/العددية/ && افعل {
print_scalar($$ref);
التبديل الأخير؛
};
/صفيف/ && افعل {
print_array(@$ref);
التبديل الأخير؛
};
/هاش/ && افعل {
print_hash(%$ref);
التبديل الأخير؛
};
/الكود/ && افعل {
تحذير "لا يمكن طباعة مرجع الوظيفة"؛
التبديل الأخير؛
};
# تقصير
تحذير "تم تخطي النوع المحدد من قبل المستخدم"؛
}
انظر بيرلسين للحصول على أمثلة أخرى في هذا النمط.
في بعض الأحيان يجب عليك تغيير مواضع الثابت والمتغير. على سبيل المثال،
لنفترض أنك تريد اختبار أي من الإجابات العديدة التي تم إعطاؤها لك، ولكن في حالة-
طريقة غير حساسة تسمح أيضًا بالاختصارات. يمكنك استخدام التقنية التالية إذا
تبدأ جميع السلاسل بأحرف مختلفة أو إذا كنت تريد ترتيب التطابقات على هذا النحو
أن أحدهما له الأسبقية على الآخر، حيث أن "إرسال" له الأسبقية على "إيقاف" هنا:
أقضم بصوت عالي($answer = <>);
إذا ("إرسال" =~ /^\Q$answer/i) { طباعة "تم إرسال الإجراء\n" }
elsif ("STOP" =~ /^\Q$answer/i) { طباعة "الإجراء متوقف\n" }
elsif ("ABORT" =~ /^\Q$answer/i) { طباعة "تم إحباط الإجراء\n" }
elsif ("LIST" =~ /^\Q$answer/i) { طباعة "الإجراء هو القائمة\n" }
elsif ("EDIT" =~ /^\Q$answer/i) { طباعة "تم تحرير الإجراء\n" }
هناك طريقة مختلفة تمامًا وهي إنشاء تجزئة لمراجع الوظائف.
أوامري % = (
"سعيد" => \&فرح،
"حزين"، => \&متجهم،
"تم" => فرعي { أراك!" },
"مجنون" => \&غاضب،
);
طباعة "كيف حالك؟"؛
أقضم بصوت عالي($سلسلة = );
إذا ($الأوامر{$string}) {
$commands{$string}->();
{} آخر
طباعة "لا يوجد مثل هذا الأمر: $string\n";
}
بدءًا من Perl 5.8، يمكن أيضًا استخدام وحدة مرشح المصدر، "Switch"، للحصول على التبديل
والحالة. لا يُنصح باستخدامه الآن، لأنه غير متوافق تمامًا مع اللغة الأصلية
تبديل Perl 5.10، ولأنه يتم تطبيقه كمرشح مصدر، فهو لا يفعل ذلك
تعمل دائمًا على النحو المنشود عندما يتعلق الأمر ببناء جملة معقد.
كيفية يمكن I قبض الوصول إلى غير محدد المتغيرات، وظائف، or طرق؟
تتيح لك طريقة التحميل التلقائي، التي تمت مناقشتها في "التحميل التلقائي" في perlsub، إمكانية التقاط المكالمات إلى
وظائف وأساليب غير محددة.
عندما يتعلق الأمر بمتغيرات غير محددة قد تؤدي إلى ظهور تحذير ضمن "استخدام التحذيرات"،
يمكنك ترقية التحذير إلى خطأ.
استخدم التحذيرات FATAL => qw(unitialized);
لماذا لا يمكن a طريقة شامل in نفسه ملف be وجد؟
بعض الأسباب المحتملة: حدوث ارتباك في ميراثك، أو أنك أخطأت في كتابة الطريقة
الاسم، أو أن الكائن من نوع خاطئ. تحقق من perlootut للحصول على تفاصيل حول أي من
الحالات المذكورة أعلاه. يمكنك أيضًا استخدام "print ref($object)" لمعرفة الفئة $object
المباركة في.
سبب آخر محتمل للمشاكل هو أنك استخدمت بناء جملة الكائن غير المباشر (على سبيل المثال،
"find Guru "Samy"") على اسم فئة قبل أن يرى Perl وجود مثل هذه الحزمة. إنه
من الحكمة التأكد من أن جميع حزمك محددة قبل البدء في استخدامها، الأمر الذي سيؤدي إلى ذلك
كن حذرًا إذا استخدمت عبارة "الاستخدام" بدلاً من "تتطلب". إذا لم يكن الأمر كذلك، تأكد من ذلك
استخدم تدوين السهم (على سبيل المثال، "Guru->find("Samy")") بدلاً من ذلك. تم شرح تدوين الكائن في
perlobj.
تأكد من القراءة حول إنشاء الوحدات النمطية في Perlmod ومخاطر الكائنات غير المباشرة فيها
"استدعاء الأسلوب" في perlobj.
كيفية يمكن I جد خارج my تيار or دعوة صفقة؟
(ساهم بها بريان د فوي)
للعثور على الحزمة التي تتواجد فيها حاليًا، استخدم الحرف الحرفي الخاص "__PACKAGE__"، مثل
موثقة في بيرلداتا. يمكنك فقط استخدام القيم الحرفية الخاصة كرموز منفصلة، لذلك يمكنك
لا يمكن استيفاءها في سلاسل كما تفعل مع المتغيرات:
$current_package = __PACKAGE__;
طباعة "أنا في الحزمة $current_package\n";
إذا كنت ترغب في العثور على الحزمة التي تستدعي الكود الخاص بك، فربما لتوفير تشخيص أفضل
يفعل الكارب، استخدم "المتصل" المدمج:
فرعي فو {
@args = ...;
my( $package, $filename, $line ) = المتصل;
طباعة "لقد تم استدعائي من الحزمة $package\n";
);
افتراضيًا، يبدأ برنامجك في الحزمة "الرئيسية"، لذلك ستكون دائمًا في بعض الحزم.
وهذا يختلف عن اكتشاف الحزمة التي يتم مباركة الكائن فيها، والتي قد لا تكون كذلك
تكون الحزمة الحالية. لذلك، استخدم "مبارك" من Scalar::Util، وهو جزء من المعيار
المكتبة منذ بيرل 5.8:
استخدم Scalar::Util qw(blessed);
بلدي $object_package = Blessed( $object );
في معظم الأحيان، لا يجب أن تهتم بالحزمة التي يتم مباركة الكائن فيها، ولكن أيضًا
طالما أنها تدعي أنها ترث من تلك الفئة:
بلدي $is_right_class = eval { $object->isa( $package ) }; # صحيحة أو خاطئة
ومع Perl 5.10 والإصدارات الأحدث، لا يتعين عليك التحقق من الميراث لمعرفة ما إذا كان
يمكن للكائن التعامل مع الدور. لذلك، يمكنك استخدام "DOES"، والتي تأتي من "UNIVERSAL":
my $class_does_it = eval { $object->DOES( $role ) }; # صحيحة أو خاطئة
يمكنك استبدال "isa" بـ "DOES" بأمان (على الرغم من أن العكس غير صحيح).
كيفية يمكن I التعليق خارج a كبير منع of بيرل الشفرة؟
(ساهم بها بريان د فوي)
الطريقة السريعة والقذرة للتعليق على أكثر من سطر واحد من لغة Perl هي أن تحيط بها
خطوط مع توجيهات قرنة. عليك أن تضع هذه التوجيهات في بداية السطر
وفي مكان ما حيث يتوقع بيرل بيانًا جديدًا (لذا ليس في منتصف عبارات مثل
التعليقات). تنهي التعليق بـ "=cut"، وتنهي قسم Pod:
= جراب
كائن $ الخاص بي = NotGonnaHappen->new();
تجاهل_sub();
$ لن يتم تعيينه = 37؛
= قص
تعمل الطريقة السريعة والقذرة بشكل جيد فقط عندما لا تخطط لترك الكود الذي تم التعليق عليه
في المصدر. إذا جاء محلل Pod، فسيظهر تعليقك متعدد الأسطر
ترجمة البود. هناك طريقة أفضل لإخفائها عن موزعي Pod أيضًا.
يمكن للتوجيه "=begin" وضع علامة على قسم لغرض معين. إذا كان المحلل اللغوي قرنة
لا يريد التعامل معها، فهو يتجاهلها فقط. قم بتسمية التعليقات بكلمة "تعليق". إنهاء
التعليق باستخدام "=end" بنفس التسمية. مازلت بحاجة إلى "=cut" للعودة إلى Perl
الكود من تعليق Pod:
=بدء التعليق
كائن $ الخاص بي = NotGonnaHappen->new();
تجاهل_sub();
$ لن يتم تعيينه = 37؛
=انتهى التعليق
= قص
لمزيد من المعلومات حول Pod، قم بمراجعة perlpod وperlpodspec.
كيفية do I واضح a صفقة؟
استخدم هذا الرمز المقدم من Mark-Jason Dominus:
حزمة الفرك الفرعية {
لا يوجد "حكام" صارمون ؛
حزمة $ الخاصة بي = Shift;
يموت "لا ينبغي حذف الحزمة الرئيسية"
إذا $pack مكافئ "" || $pack مكافئ "الرئيسي";
مخبأتي $ = *{$pack . '::'{HASH};
اسمي $؛
foreach $name (مفاتيح %$stash) {
اسمي $fullname = $pack . '::' . اسم $;
#تخلص من كل شيء بهذا الاسم.
undef $$ الاسم الكامل؛
undef @$fullname;
undef %$fullname;
undef &$fullname;
undef *$fullname;
}
}
أو، إذا كنت تستخدم إصدارًا حديثًا من Perl، فيمكنك فقط استخدام
الرمز::delete_package() تعمل بدلا من ذلك.
كيفية يمكن I تستخدم a متغير as a متغير اسم؟
غالبًا ما يعتقد المبتدئون أنهم يريدون أن يكون هناك متغير يحتوي على اسم المتغير.
فريد = 23 ؛
$varname = "فريد";
++$$فارنام; # $فريد الآن 24
هذا يعمل أحياناولكنها فكرة سيئة للغاية لسببين.
السبب الأول هو أن هذه التقنية فقط أعمال on شامل المتغيرات. هذا يعني أنه إذا
$fred هو متغير معجمي تم إنشاؤه باستخدام لي() في المثال أعلاه، لن يعمل الرمز
على الإطلاق: ستصل عن طريق الخطأ إلى المعجم العالمي وتتخطى مباشرة المعجم الخاص
كليا. المتغيرات العالمية سيئة لأنها يمكن أن تتصادم بسهولة عن طريق الخطأ
تصميم عام للتعليمات البرمجية غير القابلة للتطوير والمربكة.
المراجع الرمزية محظورة بموجب براغما "الاستخدام الصارم". هذه ليست صحيحة
المراجع وبالتالي لا يتم حسابها أو تجميع البيانات المهملة.
السبب الآخر الذي يجعل استخدام متغير للاحتفاظ باسم متغير آخر فكرة سيئة
هو أن السؤال غالبًا ما ينبع من عدم فهم هياكل بيانات بيرل،
التجزئة بشكل خاص. باستخدام المراجع الرمزية، فإنك تستخدم فقط ملف package
تجزئة جدول الرموز (مثل %main::) بدلاً من التجزئة المحددة من قبل المستخدم. الحل هو الاستخدام
التجزئة الخاصة بك أو مرجع حقيقي بدلا من ذلك.
$USER_VARS{"فريد"} = 23؛
$varname = "fred";
$USER_VARS{$varname}++; # ليس $$varname++
هناك نستخدم تجزئة %USER_VARS بدلاً من المراجع الرمزية. في بعض الأحيان هذا
يأتي في قراءة السلاسل من المستخدم بمراجع متغيرة ويريد التوسع
لهم إلى قيم متغيرات برنامج بيرل الخاص بك. وهذه أيضًا فكرة سيئة لأنها
يدمج مساحة الاسم القابلة للعنونة بواسطة البرنامج والمساحة القابلة للعنونة بواسطة المستخدم. بدلاً من
قراءة سلسلة وتوسيعها لتشمل المحتويات الفعلية لمتغيرات برنامجك:
$str = 'يحتوي هذا على $fred و$barney';
$str =~ s/(\$\w+)/$1/eeg; # تحتاج إلى تقييم مزدوج
سيكون من الأفضل الاحتفاظ بتجزئة مثل %USER_VARS وأن يكون لها مراجع متغيرة
تشير في الواقع إلى الإدخالات الموجودة في هذا التجزئة:
$str =~ s/\$(\w+)/$USER_VARS{$1}/g; # لا /ه هنا على الإطلاق
وهذا أسرع وأنظف وأكثر أمانًا من النهج السابق. بالطبع، لا تحتاج إلى ذلك
استخدم علامة الدولار. يمكنك استخدام المخطط الخاص بك لجعله أقل إرباكًا، مثل القوسين
رموز النسبة المئوية وما إلى ذلك.
$str = 'يحتوي هذا على %fred% و%barney%';
$str =~ s/%(\w+)%/$USER_VARS{$1}/g; # لا /ه هنا على الإطلاق
سبب آخر يجعل الناس يعتقدون أحيانًا أنهم يريدون أن يحتوي المتغير على اسم a
المتغير هو أنهم لا يعرفون كيفية إنشاء هياكل بيانات مناسبة باستخدام التجزئة. ل
على سبيل المثال، لنفترض أنهم أرادوا تجزئتين في برنامجهم: %fred و%barney، وهذا
لقد أرادوا استخدام متغير عددي آخر للإشارة إلى تلك بالاسم.
$name = "فريد";
$$name{WIFE} = "ويلما"; # مجموعة٪ فريد
$name = "بارني";
$$name{WIFE} = "بيتي"; # تعيين % بارني
ولا تزال هذه مرجعية رمزية، ولا تزال مثقلة بالمشاكل المذكورة
فوق. سيكون من الأفضل بكثير أن أكتب:
$folks{"fred"}{WIFE} = "wilma";
$folks{"barney"}{WIFE} = "بيتي";
واستخدم فقط تجزئة متعددة المستويات لتبدأ بها.
الأوقات الوحيدة التي كنت على الاطلاق يجب استخدام المراجع الرمزية عندما يجب عليك ذلك حقًا
الرجوع إلى جدول الرموز. قد يكون هذا لأنه شيء لا يمكن للمرء أن يأخذه على محمل الجد
إشارة إلى، مثل اسم التنسيق. قد يكون القيام بذلك مهمًا أيضًا لاستدعاءات الطريقة،
نظرًا لأن هذه دائمًا تمر عبر جدول الرموز للحل.
في تلك الحالات، يمكنك إيقاف تشغيل "المراجع الصارمة" مؤقتًا حتى تتمكن من اللعب بها
جدول الرموز . على سبيل المثال:
@ الألوان = qw (أحمر أزرق أخضر أصفر برتقالي بنفسجي بنفسجي) ؛
لـ $ name (colors) {
لا توجد "مراجع" صارمة؛ #التراجع عن الكتلة
*$name = sub { " @_ " };
}
كل هذه الوظائف (أحمر(), أزرق(), أخضر()، وما إلى ذلك) تبدو منفصلة، ولكنها حقيقية
تم تجميع الكود الموجود في الإغلاق مرة واحدة فقط.
لذلك، في بعض الأحيان قد ترغب في استخدام المراجع الرمزية لمعالجة جدول الرموز
مباشرة. هذا لا يهم بالنسبة للتنسيقات، والمقابض، والإجراءات الفرعية، لأنها كذلك
عالمي دائمًا - لا يمكنك استخدامه لي() عليهم. بالنسبة للعدديات والمصفوفات والتجزئة، بالرغم من ذلك - و
عادة للروتينات الفرعية - ربما تريد فقط استخدام المراجع الصلبة.
ابحث عن هل "سيء مترجم" تعني؟
(ساهم بها بريان د فوي)
تأتي رسالة "المترجم السيئ" من الصدفة وليس من بيرل. قد تختلف الرسالة الفعلية
اعتمادًا على إعدادات النظام الأساسي والصدفة والإعدادات المحلية.
إذا رأيت "مترجم سيء - لا يوجد مثل هذا الملف أو الدليل"، فإن السطر الأول في ملف Perl الخاص بك
لا يحتوي البرنامج النصي (السطر "shebang") على المسار الصحيح لـ Perl (أو أي برنامج آخر
قادرة على تشغيل البرامج النصية). يحدث هذا أحيانًا عند نقل البرنامج النصي من أحد البرامج
آلة إلى أخرى ولكل آلة مسار مختلف إلى Perl--/ البيرة / بن / بيرل مقابل
/usr/local/bin/Perl على سبيل المثال. قد يشير أيضًا إلى أن الجهاز المصدر يحتوي على CRLF
أجهزة إنهاء الخط والجهاز الوجهة يحتوي على LF فقط: تحاول الصدفة العثور عليها
/ البيرة / بن / بيرل، لكن لا أستطيع.
إذا رأيت "مترجم سيء: تم رفض الإذن"، فأنت بحاجة إلى جعل البرنامج النصي الخاص بك قابلاً للتنفيذ.
في كلتا الحالتين، يجب أن تظل قادرًا على تشغيل البرامج النصية باستخدام لغة Perl بشكل صريح:
% بيرل script.pl
إذا تلقيت رسالة مثل "Perl: لم يتم العثور على الأمر"، فإن Perl ليس موجودًا في PATH، وهو ما قد يحدث
يعني أيضًا أن موقع Perl ليس في المكان الذي تتوقعه، لذا تحتاج إلى ضبط إعداداتك
خط شيبانج.
Do I حاجة إلى إعادة ترجمة XS نماذج متى هناك is a تغيير in القادم C مكتبة؟
(ساهم بها أليكس بيميش)
إذا كان الإصدار الجديد من مكتبة C متوافقًا مع ABI (هذه هي واجهة التطبيق الثنائية
متوافق) مع الإصدار الذي تقوم بالترقية منه، وإذا كان إصدار المكتبة المشتركة
لم يتغير، لا ينبغي أن يكون من الضروري إعادة التجميع.
AUTHOR لأي لبس حقوق الطبع والنشر
حقوق النشر (c) 1997-2013 توم كريستيانسن وناثان توركينجتون ومؤلفون آخرون كما هو مذكور.
© جميع الحقوق محفوظة.
هذه الوثائق مجانية. يمكنك إعادة توزيعه و / أو تعديله بموجب نفس الشروط
مثل بيرل نفسها.
بغض النظر عن توزيعه ، يتم وضع جميع أمثلة التعليمات البرمجية في هذا الملف بموجب هذا
المجال العام. يُسمح لك ويشجعك على استخدام هذا الرمز في برامجك الخاصة
للمتعة أو للربح كما تراه مناسبًا. سيكون التعليق البسيط في الكود الذي يعطي الائتمان
مهذب ولكن ليس مطلوبًا.
استخدم perlfaq7 عبر الإنترنت باستخدام خدمات onworks.net