كيف يمكنني الحصول على بيرل لإعطاء رسالة تحذير عند استيراد مجموعة معينة / العلامة؟
سؤال
ولدي حزمة لقد قدمت ولدي "البالغ من وضع" التي تجعل أساسا يعمل مثل ذلك عملت قبل: استيراد كل شيء في مساحة الاسم الحالي. واحدة من أشياء لطيفة عن وجود هذا كحزمة واحدة هو أننا لم يعد لدينا للقيام بذلك. على أي حال، ما أود القيام به هو أن يكون ذلك بحيث كلما أي شخص يفعل:
use Foo qw(:oldmode);
وأرمي تحذيرا من أن هذا هو مستنكر، وأنها إما أن استيراد ما تحتاجه فقط أو وظائف الوصول العادل مع Foo-> متعة ()؛
وأي أفكار بشأن كيفية القيام بذلك؟
المحلول
حسنا، كما تصرح على وجه التحديد الذي تريد الإنذار في حالات use Mod qw<:oldmode>;
هذا يعمل على نحو أفضل:
package Foo;
use base qw<Exporter>;
use Carp qw<carp>;
...
sub import {
#if ( grep { $_ eq ':oldmode' } @_ ) { # Perl 5.8
if ( @_ ~~ ':oldmode' ) { # Perl 5.10
carp( 'import called with :oldmode!' );
}
goto &{Exporter->can( 'import' )};
}
وبفضل Frew، لذكر بناء الجملة مباراة الذكية بيرل 5.10. وأنا أتعلم كل السبل للعمل بيرل 5.10 في قانون بلدي.
<قوية> ملاحظة: كما طريقة قياسية لاستخدام مصدر في فرعي الاستيراد إما التلاعب $Exporter::ExportLevel
أو للاتصال Foo->export_to_level( 1, @_ );
لكن أنا أحب الطريقة أعلاه. انها أسرع، وأعتقد، أكثر بساطة.
نصائح أخرى
وتكتب sub import
الخاصة بك في package Foo
التي سوف تحصل دعا مع قائمة المعلمات من use Foo
.
وعلى سبيل المثال:
package Foo;
use Exporter;
sub import {
warn "called with paramters '@_'";
# do the real import work
goto &{Exporter->can('import')};
}
وحتى في import
الفرعية يمكنك البحث في قائمة وسيطة للعلامة ايقاف العمل بها، ومن ثم رمي تحذير.
تحديث م>: وكما يشير Axeman بها، يجب عليك الاتصال goto &{Exporter->can('import')}
. هذا النوع من غوتو محل دعوة روتين الحالية على المكدس، والحفاظ على الحجج الحالية (إن وجدت). ما هو مطلوب لاستيراد مصدر في طريقة () وتصديرها إلى مساحة الاسم المتصل الخاصة به.