2010-06-10 18 views
6

चलो कहते हैं कि मैं इस सूची करते हैं:जब मैं किसी सरणी के माध्यम से grep करता हूं तो मैं तत्व का अनुक्रमणिका कैसे प्राप्त कर सकता हूं?

my @list = qw(one two three four five); 

और मैं सभी o युक्त तत्वों हड़पने के लिए चाहते हैं। मैं इस होगा:

my @containing_o = grep { /o/ } @list; 

लेकिन क्या मैं भी एक सूचकांक प्राप्त करने के लिए, या grep के शरीर में सूचकांक उपयोग करने में सक्षम होने के लिए क्या करना होगा?

उत्तर

15

 

my @index_containing_o = grep { $list[$_] =~ /o/ } 0..$#list; # ==> (0,1,3) 

my %hash_of_containing_o = map { $list[$_]=~/o/?($list[$_]=>$_):() } 0..$#list 
      # ==> ('one' => 0, 'two' => 1, 'four' => 3) 
+0

अच्छी सोच :)! – Geo

10

List::MoreUtils पर एक नजर डालें। आप अपनी खुद की संस्करण रोल बिना सरणियों के साथ काम चीजों की बहुत सारी कर सकते हैं, के साथ साथ यह तेजी से है (क्योंकि यह सी/XS में लागू हो जाता है):

use List::MoreUtils qw(first_index indexes); 

my $index_of_matching_element = first_index { /o/ } @list; 

मिलान करने वाले सभी सूचकांकों के लिए, और उसके बाद उनकी संगत तत्वों, आप कर सकते हैं कार्य करें:

my @matching_indices = indexes { /o/ } @list; 
my @matching_values = @list[@matching_indices]; 

या बस:

my @matching_values = grep { /o/ } @list; 
+0

क्या यह सिर्फ पहले तत्व की अनुक्रमणिका नहीं लौटाएगा? – Geo

+0

हाँ। मुझे लगता है कि ईथर 'इंडेक्स' फ़ंक्शन का उपयोग करना था जो ब्लॉक के लिए सच होने वाली सभी इंडेक्स की एक सूची देगा। – friedo

+0

हां मैंने किया ... मैंने अपने काम की जांच करने से पहले बहुत जल्दी सबमिट किया। धन्यवाद :) – Ether

2

यह आप क्या चाहते हैं के साथ 2 सरणियों भरता है एक बार इनपुट सरणी के माध्यम से पाशन:

use strict; 
use warnings; 
my @list = qw(one two three four five); 
my @containing_o; 
my @indexes_o; 
for (0 .. $#list) { 
    if ($list[$_] =~ /o/) { 
     push @containing_o, $list[$_]; 
     push @indexes_o , $_; 
    } 
} 
संबंधित मुद्दे

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