كيف يمكنني حصر المتغيرات بيرل في إطار مكدس مختلف؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

ولدي بعض التعليمات البرمجية الذي تم إنشاؤه تلقائيا الذي يكتب بشكل فعال ما يلي في حفنة من أماكن مختلفة في بعض رمز:

no warnings 'uninitialized';
local %ENV = %ENV;
local $/   = $/;
local @INC = @INC;
local %INC = %INC;
local $_   = $_;
local $|   = $|;
local %SIG = %SIG;
use warnings 'uninitialized';

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

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

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

المحلول

وربما يمكنك ترتيب لرمز يستخدم تلك السكان المحليين أن تتولد كما الإغلاق؟ ثم هل يمكن

sub run_with_env {
    my ($sub, @args) = @_;
    no warnings 'uninitialized';
    local %ENV = %ENV;
    local $/   = $/;
    local @INC = @INC;
    local %INC = %INC;
    local $_   = $_;
    local $|   = $|;
    local %SIG = %SIG;
    use warnings 'uninitialized';  
    $sub->(@args);
}

run_with_env(sub {
    # do stuff here
});

run_with_env(sub {
    # do different stuff here
});

نصائح أخرى

ولا يدري لماذا يتم downvoted QuantumPete، وقال انه يبدو أن الحق على هذا واحد. لا تستطيع ان تقول local تهيئة المتغيرات في كتلة الاستدعاء. وظائفها الخاصة، والتهيئة / teardown أنه لا يعمل فقط على كتلة حيث تم تشغيله.

وهناك بعض الوحدات التجريبية مثل الفرعية :: ذو المستوى الأعلى و <ل أ href = "http://search.cpan.org/dist/Devel-RunBlock/lib/Devel/RunBlock.pm" يختلط = "نوفولو noreferrer"> جمعة :: RunBlock التي تسمح لك لمحاولة "أحمق "caller() عن الوظائف الفرعية أو قيام" العودة الوثب الطويل "من القيم إلى إطارات كومة أعلى (على التوالي)، ولكن أيا من هذه تفعل أي شيء لتؤثر على كيفية المتغيرات يعامل local (حاولت:)

وحتى الآن، أنها لا تبدو حقا مثل سيكون لديك للعيش مع الإعلانات المحلية في نطاق حيث كنت في حاجة إليها.

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

وQuantumPete

وperlguts perldoc يقول:

   The "Alias" module implements localization of the basic types within
   the caller's scope.  People who are interested in how to localize
   things in the containing scope should take a look there too.

وFWIW. أنا لم ينظر في Alias.pm بشكل وثيق بما يكفي لرؤية مدى سهولة هذا قد يكون.

في TCL يمكنك استخدام ذو المستوى الأعلى . أما بالنسبة للبيرل، وأنا لا أعرف.

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