जैसा कि अन्य ने कहा है, यह दस्तावेज है।
मेरे समझ के साथ कि @_
, for
, map
और grep
की अलियासिंग व्यवहार एक गति और स्मृति अनुकूलन के साथ ही रचनात्मक के लिए दिलचस्प संभावनाएं प्रदान प्रदान करता है।अनिवार्य रूप से, निर्माण के ब्लॉक का पास-बाय-रेफरेंस आमंत्रण होता है। यह अनावश्यक डेटा प्रतिलिपि से बचकर समय और स्मृति बचाता है।
use strict;
use warnings;
use List::MoreUtils qw(apply);
my @array = qw(cat dog horse kanagaroo);
foo(@array);
print join "\n", '', 'foo()', @array;
my @mapped = map { s/oo/ee/g } @array;
print join "\n", '', 'map-array', @array;
print join "\n", '', 'map-mapped', @mapped;
my @applied = apply { s/fee//g } @array;
print join "\n", '', 'apply-array', @array;
print join "\n", '', 'apply-applied', @applied;
sub foo {
$_ .= 'foo' for @_;
}
नोट List::MoreUtilsapply
समारोह का उपयोग। यह map
जैसा काम करता है लेकिन संदर्भ का उपयोग करने के बजाय, विषय चर की एक प्रति बनाता है। आप की तरह कोड लिखने से नफरत है: के लिए बाहर देखने के लिए
my @foo = apply { s/foo/bar/ } @bar;
कुछ:
my @foo = map { my $f = $_; $f =~ s/foo/bar/ } @bar;
आप apply
पसंद आएगी, जो इसे में करता है तो आप पढ़ सकते हैं पारित केवल इन निर्माणों में से एक में महत्व देता है कि इसके इनपुट मानों को संशोधित करता है, आपको "केवल पढ़ने योग्य मान का प्रयास" त्रुटि मिल जाएगी।
perl -e '$_++ for "o"'
FWIW पर मेरे लिए काम करता है, इस व्यवहार perlsyn मैनपेज में दर्ज है: http://perldoc.perl.org/perlsyn.html#Foreach-Loops – friedo
पुनरावर्तक घोषित करने जैसे कि यह के बारे में सोचो। मूल रूप से प्रत्येक भाषा जो इटरेटर्स लागू करती है, आप मौजूदा मान को संशोधित करने के लिए पुनरावर्तक का उपयोग कर सकते हैं। यदि आप कॉपी अर्थशास्त्र चाहते हैं, तो बस एक प्रति बनाएं। :) –