2010-10-22 20 views
6

मैं एक स्वनिर्धारित तुलना सबरूटीन मैं लिखे से sort उपयोग कर रहा हूँ:क्या मैं पर्ल में सॉर्ट की तुलना उपरोक्त की तुलना में तर्क पारित कर सकता हूं?

sub special_compare { 
# calc something using $a and $b 
# return value 
} 

my @sorted = sort special_compare @list; 

मैं जानता हूँ कि यह सबसे अच्छा उपयोग $a और $b जो स्वचालित रूप से निर्धारित की गई हैं, लेकिन कभी कभी मैं अपने special_compare करना चाहते हैं और अधिक तर्क प्राप्त करने के लिए, यानी:

sub special_compare { 
my ($a, $b, @more) = @_; # or maybe 'my @more = @_;' ? 
# calc something using $a, $b and @more 
# return value 
} 

मैं यह कैसे कर सकता हूं?

उत्तर

11

sort BLOCK LIST वाक्यविन्यास का उपयोग करें, perldoc -f sort देखें।

आप ऊपर special_compare उप लिखा है, तो आप उदाहरण के लिए, कर सकते हैं:

my @sorted = sort { special_compare($a, $b, @more) } @list; 
+0

+1 अच्छा और सरल! –

+3

आप हर समय कॉपी होने से रोकने के लिए '@ अधिक' के संदर्भ को पारित करना चाहते हैं। –

+0

या उपयुक्त होने पर उप-कॉल करने के बजाय इन-लाइन कोड का उपयोग करें। – mscha

3

आप प्रकार सबरूटीन के स्थान पर बंद का उपयोग कर सकते हैं:

my @more; 
my $sub = sub {   
    # calc something using $a, $b and @more 
}; 

my @sorted = sort $sub @list; 

आप पास करना चाहते हैं @_ में तत्वों की तुलना करने के लिए, ($$) पर subroutine प्रोटोटाइप सेट करें। नोट: यह असुरक्षित subroutine की तुलना में धीमी है।

+0

mscha का समाधान क्लीनर है और काम करने लगता है। क्या आप इसका उपयोग न करने का कोई कारण देखते हैं? –

+0

@ डेविड: बंद करने का उपयोग करना अधिक कुशल हो सकता है। हालांकि मैंने बेंचमार्क नहीं चलाया। –

+2

यदि प्रदर्शन एक विचार है और तुलना फ़ंक्शन भारी है, तो [श्वार्टज़ियन ट्रांसफॉर्म] (http://en.wikipedia.org/wiki/Schwartzian_transform) पर एक नज़र डालें। – mscha

संबंधित मुद्दे