के अंदर एक स्ट्रिंग की घटनाओं की संख्या की गणना करना एक निश्चित स्ट्रिंग को बड़ी संख्या में कितनी बार प्रदर्शित करने का सबसे तेज़ तरीका है? मेरा सबसे अच्छा अनुमान है कि उस स्ट्रिंग के सभी उदाहरणों को कुछ भी नहीं, लंबाई के अंतर की गणना करना और सबस्ट्रिंग की लंबाई से विभाजित करना होगा, लेकिन यह अपेक्षाकृत धीमा लगता है, और मुझे बड़ी मात्रा में डेटा का विश्लेषण करने की आवश्यकता है।किसी अन्य (पर्ल)
उत्तर
आप स्ट्रिंग को कैप्चर कर सकते हैं, फिर उन्हें गिनें। यह ()
साथ कब्जा करने के लिए एक सूची संदर्भ लगाने से किया जा सकता है:
my $x = "foo";
my $y = "foo foo foo bar";
my $c =() = $y =~ /$x/g; # $c is now 3
तुम भी एक सरणी को पकड़ने और सरणी भरोसा कर सकते हैं। इसी सिद्धांत, अलग तकनीक:
my @c = $y =~ /$x/g;
my $count = @c;
धन्यवाद! यह दूसरा समाधान की तरह है। – ronash
@ronash यह वही समाधान है। एक अस्थायी चर का उपयोग करता है, दूसरा नहीं करता है। आप 'मेरी $ count = @c = $ y = ~/$ x/g' भी कर सकते हैं, लेकिन इसके बजाय आप केवल' @ c' को अनदेखा कर सकते हैं और '()' का उपयोग कर सकते हैं। यदि आप वास्तविक मैचों की परवाह नहीं करते हैं तो सबसे अच्छा कौन सा है। – TLP
यह काम नहीं करता है अगर '$ x' में कुछ रेगेक्स वर्ण होते हैं, क्योंकि' $ x' को रेगेक्स के रूप में व्याख्या किया जाता है। इसे ठीक करने के लिए '\ Q' जोड़ें, उदाहरण के लिए। '/ \ क्यू $ एक्स/g'। अधिक जानकारी के लिए 'quotemeta' देखें। – tuomassalo
आप वैश्विक रेगेक्स का उपयोग कर सकते हैं। कुछ ऐसा:
my @matches = $bigstring =~ /($littlestring)/g;
my $count = @matches;
यह सबसे सरल समाधान की तरह लगता है, इसलिए मुझे लगता है कि मैं इसका उपयोग करूंगा, जब तक कि कोई तेज़ न हो? धन्यवाद! – ronash
मुझे रेगेक्स की गति के बारे में निश्चित नहीं है, लेकिन मुझे यकीन है कि मिलान करने वाले परिचालनों का उपयोग केवल प्रतिस्थापन से तेज है। और मैं ऐसे समाधान के बारे में नहीं सोच सकता जिसके पास रेगेक्स के साथ कुछ नहीं है (यह अन्यथा देखना बहुत दिलचस्प होगा!) – MattLBeck
my $string = "aaaabbabbba";
my @count = ($string =~ /a/g);
print @count . "\n";
या
my $count = ($string =~ s/a/a/g);
बस संपूर्णता के लिए आप बार-बार एक पाश में सूचकांक फ़ंक्शन को कॉल करें और हर समय भरोसा कर सकते हैं उस में सबस्ट्रिंग के सूचकांक लौटे स्ट्रिंग, और प्रारंभिक स्थिति बदलें। वह regexes का उपयोग करने से बच जाएगा, और मेरे परीक्षण में regex समाधान से थोड़ा तेज है।
मुझे लगता है कि यहाँ से करने के लिए एक उप अनुकूलित किया है: http://www.misc-perl-info.com/perl-index.html
sub occurrences {
my($x, $y) = @_;
my $pos = 0;
my $matches = 0;
while (1) {
$pos = index($y, $x, $pos);
last if($pos < 0);
$matches++;
$pos++;
}
return $matches;
}
- 1. पर्ल: किसी अन्य फ़ाइल से 'my' चरों तक पहुंच
- 2. किसी अन्य
- 3. किसी अन्य
- 4. किसी अन्य
- 5. किसी अन्य
- 6. किसी अन्य
- 7. किसी अन्य
- 8. किसी अन्य
- 9. किसी अन्य
- 10. किसी अन्य
- 11. किसी अन्य
- 12. किसी अन्य छवि में किसी अन्य क्षेत्र में किसी अन्य क्षेत्र में क्षेत्र की प्रतिलिपि बनाना
- 13. फ़ाइल किसी अन्य प्रक्रिया
- 14. mvc3 किसी अन्य
- 15. PHP: किसी अन्य वर्ग
- 16. किसी अन्य xib
- 17. मैं किसी अन्य वर्ग
- 18. किसी अन्य एएसपी.NET एप्लिकेशन
- 19. किसी अन्य वर्ग
- 20. JLabel किसी अन्य JLabel
- 21. किसी अन्य वेक्टर
- 22. किसी अन्य चर
- 23. किसी अन्य वर्ग
- 24. किसी अन्य स्थैतिक वर्ग
- 25. किसी अन्य फोर्टन
- 26. किसी अन्य एसवीजी फ़ाइल
- 27. किसी अन्य मैट्रिक्स
- 28. किसी अन्य क्लोजर नेमस्पेस
- 29. किसी अन्य रंग
- 30. किसी अन्य ओपनसीएल कर्नेल
इस बाहर की जाँच करने के लिए ... हालांकि यह 1999 से है चाहता हूँ सकता है, और वहाँ बात की इस तरह करने के लिए सबसे अधिक संभावना अन्य तरीके हैं कुशलता से: http://www.perlmonks.org/?node=How%20can%20I%20count%20the%20number%20of%20occurrences%20of%20a%20substring%20within%20a%20string%3F – summea
'perldoc -q गिनती ' – toolic
क्या ये ओवरलैप हो सकते हैं? – tchrist