ऐसा करने के कुछ तरीके हैं। स्पष्ट रूप से $foo
पर स्केलर रेफरी पास करें, या संदर्भ अर्थशास्त्र द्वारा पर्ल के अंतर्निर्मित पास का लाभ उठाएं।
स्पष्ट संदर्भ:
my $foo = "old value";
doRepl(\&repl, \$foo);
print $foo; # prints "new value";
sub repl {
my $line = shift;
$$line = "new value";
}
sub doRepl {
my ($replFunc, $foo) = @_;
$replFunc->($foo);
}
दर्रा संदर्भ द्वारा:
my $foo = "old value";
doRepl(\&repl, $foo);
print $foo; # prints "new value";
sub repl {
$_[0] = "new value";
}
sub doRepl {
my $replFunc = shift;
&$replFunc;
}
पहले एक उपयोग सामान्य पर्ल कठिन संदर्भ काम करने के लिए: संदर्भ द्वारा
my $foo = "old value";
doRepl(\&repl, $foo);
print $foo; # prints "new value";
sub repl {
$_[0] = "new value";
}
sub doRepl {
my $replFunc = shift;
$replFunc->(@_);
}
यहां तक कि अधिक सजावटी पास ।
रेफ विधि द्वारा पहला पास इस तथ्य का उपयोग करता है कि पर्ल सभी कार्यों को संदर्भों के रूप में तर्क देता है। @_
के तत्व वास्तव में तर्क सूची में मानों के लिए उपनाम हैं जब subroutine कहा जाता है। foo()
में $_[0]
को बदलकर, आप वास्तव में foo()
पर पहला तर्क बदलते हैं।
रेफ विधि द्वारा दूसरा पास इस तथ्य का उपयोग करता है कि एक उप &
सिगिल के साथ बुलाया जाता है और उसके माता-पिता को @_
कॉलर का सरणी नहीं मिलता है। अन्यथा यह समान है।
अद्यतन: मैंने देखा है कि आप $_[0]
से बचने की इच्छा रखते हैं। आप repl में यह कर सकते हैं अगर आप चाहते हैं:
sub repl {
for my $line($_[0]) {
$line = 'new value';
}
}
दुर्भाग्य से, मैंने दस्तावेज़ों के "कार्यान्वयन" अनुभाग को देखा ... एएके! मुझे लगता है कि यह मॉड्यूल सॉसेज की तरह है ... यदि आप नहीं जानते कि उन्हें कैसे बनाया जाता है तो बहुत अधिक आनंददायक ... :) – JoelFan
@ जोएलफ़ान: हाँ। यह बहुत अधिक है "घर पर यह कोशिश न करें" मॉड्यूल :) –
"यह मॉड्यूल स्रोत फ़िल्टर का उपयोग नहीं करता है" शुरू होता है और बस वहां से डाउनहिल चला जाता है ... :) – JoelFan