هل هو إلزامي أن مجلد عن طريق اسم الحزمة يجب أن تكون موجودة لإنشاء حزمة؟

StackOverflow https://stackoverflow.com/questions/468818

  •  19-08-2019
  •  | 
  •  

سؤال

ونحن العوملة من رمز مشترك من مشروع بيرل لدينا. ينبغي تقسيم واحد البرنامج الرئيسي إلى عدة وحدات إعادة استخدامها.

واسم برنامجنا هو validate_results.pl الذي يحتوي على مجموعة من الأوامر التحقق من الصحة. ونحن نخطط لتقسيم هذا إلى وحدات صغيرة جدا بحيث validate_results.pl ينبغي أن يكون مثل:

use Common::Validate_Results;
use Common::Validate_Results::CommonCommands;
use Common::Validate_Results::ReturnCodeValidation;
...

وحسب فهمي يجب أن إنشاء مجلد المشترك وبموجب ذلك Validate_Results.pm يجب أن تكون موجودة. مرة أخرى تحت Common، ينبغي إنشاء مجلد Validate_Results وبموجب ذلك CommonCommands وReturnCodeValidation المجلدات يجب أن تكون موجودة.

هل هو إلزامي أن جميع هذه المجلدات يجب أن تكون موجودة أو يمكن أن لدينا جميع البرامج بيرل في مجلد واحد ومنطقيا مجموعة منهم ولا تزال تستخدم الطريقة المذكورة أعلاه للوصول إلى وحدات (مثلا استخدام common::validate_results من هذا القبيل).

هل كانت مفيدة؟

المحلول

مطلوب التسلسل الهرمي الملفات. ودائما يكون موجودا A :: B :: C في A / B / C.pm، في مكان ما فيINC.

إذا <م> هل لديك للالتفاف على هذا، وقراءة perldoc -f تتطلب ، وتبحث على وجه التحديد لقسم حول المراجع روتين فيINC. نعم، يمكنك جعل المحمل وحدة تفعل أشياء غريبة اذا كان هذا ما تريده حقا. ولكن هذا ليس ما تريد، ثق بي. مجرد عصا في الاتفاقية، مثل غيرها من 99.9999999٪ من طلبات بيرل القيام به.

نصائح أخرى

إذا كنت ترغب في استخدام '' وحدات الخاص بك، فإنك يجب أن تتوافق مع هيكل. إذا كنت ترغب في الحصول على حول أنه يمكنك "تتطلب" وحدات الخاص بك بدلا من ذلك، تمرير اسم الملف إلى يحتاجون إليها.

وكنت حقا لا ينبغي أن تفعل هذا، وإن كان. إذا كنت حقا لا تريد أن يكون لها بنية الدليل اخراجه من أسماء وحدة (على الرغم من أن يمكن أن يؤدي إلى مشاكل في المستقبل إذا كان لديك أي وقت مضى اسم الوحدة النمطية التي تتعارض مع شيء أكثر عمومية من CPAN). ببساطة إضافة دليل البرامج النصية إلى مسار INC عبر بحث :: بن واستخدام وحدات مباشرة:

use FindBin;
use lib $FindBin::Bin;

use ValidateResults;
use CommonCommands;
use ReturnCodeValidation;

وHTH

وهنا مثال من وحدة نمطية وانها وحدات فرعية في نفس الملف:

package Foo;
use strict;
use Exporter 'import';

our @EXPORT = ( 'from_foo' );

sub from_foo { print "from_foo\n"; }

package Foo::Bar;
use strict;
use Exporter 'import';

our @EXPORT = ( 'from_foo_bar' );

sub from_foo_bar { print "from_foo_bar\n"; }

1;

في البرنامج الخاص بك، إذا كنت تستخدم وحدة <م> فو (واحد مع ملف .pm):

use Foo;

وسيكون لديك الوصول إلى <م> فو :: بار وظائف، باستثناء فقط كأسماء الكنسي (فو :: :: بار from_foo_bar). يمكنك استيرادها مثل هذا:

use Foo;
Foo::Bar->import;

لاحظ أنك لا تستطيع أن تفعل هذا:

use Foo::Bar;

وبسبب عدم وجود ملف <م> فو / Bar.pm .

واسم الحزمة في قيادة 'الاستخدام "غير فعال فقط مسار الذي ينتهي مع ملف .pm، لذلك أنت لا تحتاج إلى مجلد مع اسم كل حزمة. في المثال الخاص بك، تحتاج إلى مجلدات:

Common
Common/Validate_Results

ولكن لا تحتاج مجلدات:

Common/Validate_Results/CommonCommands
Common/Validate_Results/ReturnCodeValidation

لايوجد اسم الحزمة الفعلي في ملف .pm أن يكون نفس الاسم في استخدام '' الأمر الذي يحمل عليه. ولكن الحفاظ على مسارات يتفق مع أسماء حزمة هو دائما فكرة جيدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top