كيف يمكنني الحصول على بيرل لإعطاء رسالة تحذير عند استيراد مجموعة معينة / العلامة؟

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

سؤال

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

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')}. هذا النوع من غوتو محل دعوة روتين الحالية على المكدس، والحفاظ على الحجج الحالية (إن وجدت). ما هو مطلوب لاستيراد مصدر في طريقة () وتصديرها إلى مساحة الاسم المتصل الخاصة به.

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