में स्कोप परिवर्तन पर कोड डालें, मुझे अक्सर वर्तमान स्कोप छोड़ने के लिए कोड शेड्यूल करने में सक्षम होने के लिए उपयोगी लगता है। टीसीएल में मेरे पिछले जीवन में, एक दोस्त ने एक फ़ंक्शन बनाया जिसे हम डिफर कहते हैं।पर्ल
यह कोड सक्षम करता है जैसे: सेट fp [open "x"] डिफर ("$ $ fp");
जो वर्तमान दायरे से बाहर निकलने पर लागू किया गया था। मुख्य लाभ यह है कि यह हमेशा कोई फर्क नहीं पड़ता कि मैं कैसे/कहाँ गुंजाइश छोड़ देता हूं।
इसलिए मैंने पर्ल में कुछ ऐसा ही लागू किया लेकिन ऐसा लगता है कि वहां एक आसान तरीका होगा। टिप्पणियाँ आलोचकों का स्वागत है।
तरह से मैं पर्ल में यह किया:
- एक वैश्विक, बंधे चर जो निष्पादित करने के लिए बाद के चरणों की एक सरणी रखती पैदा करते हैं।
- जब भी मैं बाहर निकलने के लिए एक एफएन शेड्यूल करना चाहता हूं, तो मैं सरणी को बदलने के लिए स्थानीय का उपयोग करता हूं। जब मैं वर्तमान दायरा छोड़ देता हूं, पर्ल वैश्विक को पिछले मान में बदल देता है क्योंकि वैश्विक बंधे हैं, मुझे पता है कि यह मान परिवर्तन कब होता है और सूची में उप-सब्सक्राइब कर सकता है।
वास्तविक कोड नीचे है।
क्या ऐसा करने का कोई बेहतर तरीका है? ऐसा लगता है कि यह एक सामान्य रूप से आवश्यक क्षमता होगी।
use strict;
package tiescalar;
sub TIESCALAR {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
sub FETCH {
my $self = shift;
return $self->{VAL};
}
sub STORE {
my $self = shift;
my $value = shift;
if (defined($self->{VAL}) && defined($value)) {
foreach my $s (@{$self->{VAL}}) { &$s; }
}
$self->{VAL} = $value;
}
1;
package main;
our $h;
tie($h, 'tiescalar');
$h = [];
printf "1\n";
printf "2\n";
sub main {
printf "3\n";
local $h = [sub{printf "9\n"}];
push(@$h, sub {printf "10\n";});
printf "4\n";
{
local $h = [sub {printf "8\n"; }];
mysub();
printf "7\n";
return;
}
}
sub mysub {
local $h = [sub {printf "6\n"; }];
print "5\n";
}
main();
printf "11\n";
यह एक अच्छा विचार है, लेकिन मैं एक बेहतर संस्करण बनाना चाहता हूं उस। कार्यान्वयन थोड़ा बोझिल IMHO है। –