जैसा कि अन्य ने उल्लेख किया है, पर्ल केवल स्ट्रिंग का मूल्यांकन करेगा क्योंकि आपने रनटाइम पर कंपाइलर को आमंत्रित करने के लिए eval
का उपयोग करके उन्हें लिखा है। आप कुछ अन्य उत्तरों में उल्लिखित संदर्भों का उपयोग कर सकते हैं, लेकिन यह कोड के तरीके को बदलता है ($$a
बनाम $a
)। हालांकि, यह पर्ल है, tie
का उपयोग कर, एक साधारण चर के पीछे उन्नत कार्यक्षमता को छिपाने का एक तरीका है।
{package Lazy;
sub TIESCALAR {bless \$_[1]} # store a reference to $b
sub FETCH {${$_[0]}} # dereference $b
sub STORE {${$_[0]} = $_[1]} # dereference $b and assign to it
sub new {tie $_[1] => $_[0], $_[2]} # syntactic sugar
}
my $b = 1;
Lazy->new(my $a => $b); # '=>' or ',' but not '='
print "$a\n"; # prints 1
$b = 2;
print "$a\n"; # prints 2
आप tie
के लिए दस्तावेज़ देखने सकते हैं, लेकिन संक्षेप में, यह आप एक चर के अपने खुद के कार्यान्वयन (scalars के लिए, सारणी, हैश, या फ़ाइल संभालती) को परिभाषित करने की अनुमति देता है।तो यह कोड नए चरको कार्यान्वयन के साथ बनाता है जो $b
के वर्तमान मान को प्राप्त या सेट करता है ($b
आंतरिक रूप से संदर्भ संग्रहीत करके)। new
विधि की सख्ती से आवश्यकता नहीं है (कन्स्ट्रक्टर वास्तव में TIESCALAR
है) लेकिन सीधे कॉलिंग कोड में tie
का उपयोग करने से बचने के लिए सिंटैक्टिक चीनी के रूप में प्रदान किया जाता है।
(tie my $a, 'Lazy', $b;
होगा जो)
स्रोत
2010-06-03 21:47:03
मैं इस तरह के उदाहरणों के लिए '$ a' और' $ b' का उपयोग न करने का सुझाव दूंगा, क्योंकि ये perl विशेष हैं और * नहीं * lexically scoped (जैसा कि 'my' के सामने 'my' के आपके चूक से प्रमाणित है बी उदाहरण के लिए)। तकनीकों के अच्छे चयन के लिए – pilcrow