2013-01-09 8 views
6

मैं केवल 4, 5, और टैब से अलग रिकॉर्ड के 7 वें तत्वों (माना) निकालने के लिए चाहते हैं, मैं की तरह कुछ कर सकते हैं:पर्ल में "पूंछ टुकड़ा" कैसे निर्दिष्ट करें?

my @f = (split(/\t/, $_, -1))[3, 4, 6]; 

लेकिन क्या होगा अगर मैं 4 तत्व और "पूंछ चाहते टुकड़ा "7 वें से सभी तत्वों को सरणी के अंत तक शामिल करता है? मुझे नहीं पता कि यह एक पंक्ति में कैसे करें। सबसे अच्छा मैं कर सकता हूँ यह है:

my @f = split(/\t/, $_, -1); 
@f = @f[3, 6..$#f]; 

दो पंक्तियों में यह कार्रवाई करते के लिए एकमात्र कारण है, ताकि मैं दूसरी पंक्ति में $#f निर्दिष्ट कर सकते हैं, लेकिन इस विशिष्टता का एक बड़ा डिग्री की तुलना में में निहित है जरूरत पर जोर देता कार्य; कार्य वास्तव में देखभालsplit द्वारा लौटाए गए मान में कितने तत्व हैं। यह "सातवीं तत्व से उपलब्ध सबकुछ" जैसी कुछ निर्दिष्ट करने में सक्षम होना अच्छा होगा ... यह एक "पूंछ टुकड़ा" द्वारा मेरा मतलब है: एक टुकड़ा जहां केवल प्रारंभिक बिंदु निर्दिष्ट किया गया है, जबकि अंत बिंदु निहित छोड़ दिया गया है।

(विनिर्देश इस तरह की यूनिक्स में cut उपयोगिता का उपयोग करता है में आम है, उदाहरण के लिए:

... | cut -f 4,7- 

)

वहाँ कुछ subscripting अभिव्यक्ति है कि मैं (split(...)) उपसूचक के लिए सीधे आवेदन कर सकते हैं है उपरोक्त कोड की अंतिम दो पंक्तियों द्वारा प्राप्त की गई एक ही पंक्ति में एक ही प्रभाव में उत्पादन करने के लिए?

संपादित करें: स्पष्ट होने के लिए, मैं जो बचने की कोशिश कर रहा हूं वह $#ARRAY निर्माण है। मुझे पता है कि मैं हमेशा की तरह

my @f = do { my @t = split(/\t/, $_, -1); @t[3, 6..$#t] }; 

उत्तर

8

एक सूची टुकड़ा की कोष्ठक में अभिव्यक्ति कुछ कर सकते हैं शून्य या अधिक अनुक्रमित की एक सूची प्रदान करना होगा। तो आपको इसे उत्पादित करने से पहले सूची में आइटमों की संख्या जानना होगा। तो नहीं, यह सूची स्लाइस का उपयोग करके नहीं किया जा सकता है।

स्टैक पर एक सूची तक पहुंचने का सबसे सीधा तरीका @_ के माध्यम से है। इसके लिए एक उप कॉल की आवश्यकता होती है, लेकिन यह आपको स्टैक पर सूची छोड़ने के लिए एक आसान तंत्र प्रदान करता है।

my @f = sub { @_[6..$#_] }->(split(/\t/, $_, -1)); 

ध्यान दें कि यह समाधान एक सरणी का निर्माण नहीं करता और कोड में आप के बाद से अपने प्रश्न में शामिल किया है की तरह है कि सरणी में मानों की प्रतिलिपि बनाएँ।

+0

मेरे उत्तर का विस्तार किया। – ikegami

+0

बहुत अच्छा विचार –

+1

Niiiiice। मुझे कुछ अस्थायी प्रतियों से बचने के लिए '@ _' के उपयोग को पसंद है। – LeoNerd