2013-04-22 6 views
8

कुछ खोज किया लेकिन कुछ भी उपयोगी नहीं मिला। मैं सोच रहा था कि शुरुआती लोगों के लिए माता-पिता/ब्रैकेट का उपयोग करने के "नियम" के बारे में जानने के लिए सॉर्ट की सारांश सारणी है, विशेष रूप से,(), [], {} के बीच अंतर। दुर्भाग्यवश, मेरे अनुभव में, use strict और use warnings मुझे बताएं कि क्या मैं गलत माता-पिता का उपयोग करता हूं।पेरिस/ब्रैकेट्स के नियमों (?) में perl

उदाहरण के लिए, नीचे कानूनी कोड हैं (बी/सी वे ikegami से आए हैं)।

@{"genotype".($i)} 
@{$genotype[$i]} 
$genotype[$i] = [ split (/:/, $original_line[$i])] 
my @genotype = map {[split /:/]} @original_line[6..14] 

लेकिन क्या ये नीचे भी वैध हैं? अक्सर बार यह मुश्किल है (मेरे लिए) यह जानने के लिए कि क्या यह कोड का अन्य भाग (तर्क) है जो समस्या का कारण बनता है। मेरे लिए माता-पिता के माध्यम से छंटनी (एक शुरुआती) अच्छा कोडिंग के लिए तुच्छ लगता है। माता-पिता का सही तरीके से उपयोग करने के तरीके पर कोई भी मार्गदर्शिका बहुत अच्छी होगी।

@{"genotype".[$i]} 
@["genotype".($i)] 
@("genotype".($i)) 
@{$genotype($i)} 
@[$genotype($i)] 
$genotypes[$i] = (split (/:/, $original_line[$i])) 
my @genotype = map ([split /:/]) @original_line[6..14] 
+1

क्या आपने संदर्भ ट्यूटोरियल पढ़ा था? http://perldoc.perl.org/perlreftut.html – mzedeler

+1

[पर्ल परिचय] (http://perldoc.perl.org/perlintro.html) से शुरू करें और फिर [पर्ल डेटा संरचनाओं] के बारे में पढ़ें (http: // perldoc .perl.org/perldsc.html)। –

+0

इनमें से अधिकतर लिंक विशेष रूप से ब्रैकेट/अभिभावकों के उपयोग के बारे में बात नहीं करते हैं, जब तक कि मैं उन्हें अपने पढ़ने में याद नहीं करता। वे विशेष उपयोग के लिए प्रासंगिक उदाहरण प्रदान करते हैं, लेकिन मैं विशिष्टताओं के साथ जाने से पहले एक सामान्य दृश्य (यदि मौजूदा) प्राप्त करने की उम्मीद कर रहा था - उदाहरण के रूप में एक सामान्य दृश्य हमेशा घुंघराले ब्रैकेट या सरणी के साथ हमेशा स्क्वायर ब्रैकेट या संदर्भ के साथ घुंघराले ब्रैकेट के साथ संदर्भ। आमोन का जवाब मेरे जैसे शुरुआती के लिए एक अच्छा सारांश प्रदान करता है। सबको शुक्रीया। –

उत्तर

6

पर्ल, ब्रैकेट, ब्रेसिज़ और पैरों में सभी का अर्थ कई अर्थ है, लेकिन घुंघराले ब्रेसिज़ में शायद सबसे अधिक है।

  • कोष्ठक
    • बाहर क्रमबद्ध पूर्वता 2 * 3 + 4 बनाम 2 * (3 + 4)
      • फ़ंक्शंस के लिए तर्क सूचियों को डिलीमिट करना इस का एक सबकेस है: join "", 1, 2, 3 बनाम।तीर ऑपरेटर के साथ विधि कॉल की join("", 1, 2), 3
      • चारों ओर तर्क सूची: $foo->bar(1, 2) (खाली arglist के लिए आवश्यक नहीं) एक सबरूटीन कॉल के रूप में पिछले bareword की
    • फोर्स व्याख्या। Foo->new और Foo()->new की तुलना करें।
    • तीर ऑपरेटर के साथ आह्वान coderefs: $code->()
    • उपनेमका प्रोटोटाइप sub foo ($$;$%) { ... }
  • वर्गाकार कोष्ठक
    • सरणी सबस्क्रिप्ट ऑपरेटर my @array = 1 .. 5; $array[1]
    • Arrayref शाब्दिक my $aref = [1 .. 5]
  • घुंघराले ब्रेसिज़
    • ब्लाकों
    • हैश सबस्क्रिप्ट ऑपरेटर $hash{foo}
    • Hashref शाब्दिक my $hashref = { a => 3, b => 2 }
    • संप्रदान कारक ब्लॉक print { $filehandles[5] } "Hello world"
    • ( do, sub, map, grep, सशर्त, पाशन निर्माणों, नंगे ब्लॉक, लेबल ब्लॉक, ... के लिए)
    • सर्कफिक्स डीरेंसेंस ऑपरेटर्स @{ $aref }, %{ $hashref }, ...
    • पैकेज ब्लॉक package Foo { ... }

... और लगभग सभी पात्रों s(foo){bar}g


की तरह रोचक सामग्री के लिए अग्रणी, बोली की तरह ऑपरेटरों q//, qq//, qr//, qx//, m//, s///, tr///, y/// के लिए डिलीमीटर के रूप में इस्तेमाल किया जा सकता

@{"genotype".($i)} प्रतीकात्मक dereferencing के लिए curlies का उपयोग करता है, और माता-पिता (असीमित रूप से) प्राथमिकता को हल करें।

@{$genotype[$i]}

$genotype[$i] = [ split (/:/, $original_line[$i])] अपसंदर्भन के लिए सरणी सब्स्क्रिप्ट ऑपरेटर के रूप में कोष्ठक, और curlies का उपयोग करता विभिन्न भागों में है: $genotype[$i] और $original_line[$i] सरणी subscripting के लिए उपयोग कोष्ठक। = [ ... ] अज्ञात सरणी बनाने के लिए ब्रैकेट का उपयोग करता है। split(/:/, ...) में माता-पिता split (प्राथमिकता को सॉर्ट करना) के लिए तर्क सूची को सीमित करें।

my @genotype = map {[split /:/]} @original_line[6..14]@original_line[6..14] में सरणी सबस्क्रिप्ट ऑपरेटर के रूप में ब्रैकेट का उपयोग करता है, और [split /:/] में अज्ञात सरणी के लिए। कर्लियों का उपयोग ब्लॉक को map पर पहली तर्क के रूप में बनाने के लिए किया जाता है।

+1

माता-पिता को नो-ऑप के रूप में भी इस्तेमाल किया जा सकता है जहां एक अभिव्यक्ति अपेक्षित है ('@a =();', '$ count =() = f();') – ikegami

+0

मुझे पसंद है कि आपने उन माता-पिता का दावा कैसे नहीं किया सूचियां बनाएं – ikegami

+0

घुमावों का उपयोग इंटरपोलेशन में चर को सीमित करने के लिए भी किया जाता है (उदा। '" $ {Foo} बार "')। असल में, आप इंटरपोलेशन के बाहर भी ऐसा कर सकते हैं (उदा। '$ A = $ foo;') हालांकि ऐसा करने का कोई कारण नहीं है। – ikegami

1

map दोनों वाक्यविन्यास

map BLOCK LIST 
map EXPR, LIST 

दोनों ही मामलों में है, कोष्ठक एक सामान्य उप तरह आर्ग भर में उपयोग किया जा सकता है। नोट के

map(BLOCK LIST) 
map(EXPR, LIST) 

एक बात यह है कि जब सूची एक खाली सूची लौट सकते हैं, यह के रूप में बाद के चरणों के लिए आप कर सकते हैं पूरी तरह से छोड़े गए नहीं किया जा सकता है।


map { [split /:/] } @original_line[6..14] 

map BLOCK LIST का एक उदाहरण है, जबकि

map([split /:/]) 

अवैध रूप से EXPR प्रदान करता है, लेकिन कोई सूची। यहाँ स्वीकार्य वाक्यविन्यास हैं:

map({ [split /:/] } @original_line[6..14]) 
map { [split /:/] } @original_line[6..14] 
map([split /:/], @original_line[6..14]) 
map [split /:/], @original_line[6..14] 

अभिव्यक्ति की तरह कुछ था तो (2 + $ _) * 3, आप केवल इन विकल्प हैं:

map({ (2+$_)*3 } ...) 
map { (2+$_)*3 } ... 
map((2+$_)*3, ...) 

आपको लगता है कि से कोष्ठक निकालते हैं पिछले है, तो आप अवैध

map(2+$_) 

अंत आप का उपयोग को स्पष्ट कर सकते हैं +

012,
map +(2+$_)*3, ... 

लेकिन map BLOCK LIST नोटेशन पर स्विच करना बेहतर है।