2009-10-06 19 views
5

का उपयोग कर रहा HTML::ElementHTML::TreeBuilder और HTML::Element->find से प्राप्त रों की एक सरणी है और मैं कुछ अन्य चर के लिए अपने as_text मूल्य सौंपने होंगे। मैं जानता हूँ कि मैं वास्तव में आसानी सेबनाना सरणी नक्शा

my ($var1, $var2) = ($arr[0]->as_text, $arr[1]->as_text); 

कर सकते हैं, लेकिन मैं मैं map बजाय का उपयोग सिर्फ कोड में थोड़ा और अधिक पठनीय बनाने के लिए कर सकता है के रूप में वहाँ सरणी में कम से कम 8 तत्व हैं उम्मीद कर रहा था। मैं पर्ल के लिए वास्तव में नया हूं इसलिए मुझे पूरा यकीन नहीं है कि क्या करना है।

क्या कोई मुझे सही दिशा में इंगित कर सकता है?

उत्तर

9

आप अच्छी तरह से perldoc -f map में निपुण कर रहे हैं यह बहुत स्पष्ट है:

my @as_texts = map { $_->as_text } @arr; 

रूप में अच्छी तरह अगर आप प्रदान करना चाहते हैं काम करता है scalars की एक सूची के लिए:

my($var1, $var2, $var3, ...) = map { $_->as_text } @arr; 

लेकिन निश्चित रूप से सरणी संस्करण अज्ञात संख्या के तत्वों के लिए बेहतर है।

+2

यह मैं निजी वरीयता का एक बड़ा मुद्दा है, लेकिन जब मैं ट्रांसफॉर्म इतना आसान होता हूं तो मैं 'map' के EXPR रूप का उपयोग करना पसंद करता हूं: '_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ – hobbs

+1

@ हॉब्स - मैं अक्सर करता हूं, लेकिन मुझे यकीन नहीं था कि $ _-> as_text उस मामले में अपेक्षित काम करेगा। मुझे पता है कि 'नक्शा chr, @ arr' काम करता है, लेकिन मुझे नहीं पता था कि विधि कॉल को उसी तरह काम करने के लिए बनाया जा सकता है या नहीं। मुझे लगता है कि इसका पता लगाने का एकमात्र तरीका यह परीक्षण करना है, लेकिन इस विशिष्ट मामले में मैं व्यक्तिगत रूप से ब्रैकेट का उपयोग करना पसंद करता हूं। –

+1

@ हॉब्स 'नक्शा एक्सपीआर, लिस्ट 'नक्शा ब्लॉक सूची' से भी तेज है लेकिन मैं बाद के लिए एक चूसने वाला हूं। –

1

ध्यान दें कि, अगर आप सिर्फ @arr के पहले दो तत्वों मैप करना चाहते हैं:

my($var1, $var2) = map { $_->as_text } @arr; 

@arr के सभी तत्वों के लिए $_->as_text आह्वान करेंगे। उस मामले में, एक सरणी टुकड़ा का उपयोग अनावश्यक कॉल से बचने के लिए:

my($var1, $var2) = map { $_->as_text } @arr[0 .. 1]; 

उदाहरण:

#!/usr/bin/perl 

use strict; 
use warnings; 

my @arr = 'a' .. 'z'; 
my $count; 
my ($x, $y) = map { $count++; ord } @arr; 

print "$x\t$y\t$count\n"; 

$count = 0; 
($x, $y) = map { $count++; uc } @arr[0 .. 1]; 

print "$x\t$y\t$count\n"; 

आउटपुट: जबकि uc बुलाया गया था

 
C:\Temp> jk 
97  98  26 
A  B  2 

ord@arr के प्रत्येक तत्व के लिए बुलाया गया था केवल उन तत्वों के लिए जिन्हें हम रुचि रखते थे।

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