मुझे यह कोड एक स्क्रिप्ट में मिला, क्या आप कृपया बता सकते हैं कि map
और grep
यहां क्या करते हैं?
open FILE, '<', $file or die "Can't open file $file: $!\n";
my @sets = map {
chomp;
$_ =~ m/use (\w+)/;
$1;
}
grep /^use/, ( <FILE> );
close FILE;
$file
द्वारा बताई गई फ़ाइल में है:
use set_marvel;
use set_caprion;
and so on...
1 उत्तर
इस तथ्य के बावजूद कि आपका प्रश्न कोई शोध प्रयास नहीं दिखाता है, मैं वैसे भी इसका उत्तर देने जा रहा हूं, क्योंकि यह भविष्य के पाठकों के लिए उपयोगी हो सकता है जो इस पृष्ठ पर आते हैं।
perldoc के अनुसार, map
:
सूची के प्रत्येक तत्व के लिए ब्लॉक या EXPR का मूल्यांकन करता है (स्थानीय रूप से सेटिंग
$_
प्रत्येक तत्व के लिए) और परिणामों से बना सूची मान लौटाता है इस तरह के प्रत्येक मूल्यांकन के। अदिश संदर्भ में, कुल संख्या लौटाता है इस प्रकार उत्पन्न तत्वों की। सूची संदर्भ में ब्लॉक या EXPR का मूल्यांकन करता है, इसलिए LIST का प्रत्येक तत्व शून्य, एक या अधिक तत्वों का उत्पादन कर सकता है लौटाया गया मूल्य।
दूसरी ओर grep
के लिए परिभाषा:
सूची के प्रत्येक तत्व के लिए ब्लॉक या EXPR का मूल्यांकन करता है (स्थानीय रूप से सेटिंग
$_
प्रत्येक तत्व के लिए) और उनमें से सूची मान लौटाता है वे तत्व जिनके लिए अभिव्यक्ति का मूल्यांकन सत्य है। अदिश में संदर्भ, अभिव्यक्ति के सत्य होने की संख्या लौटाता है।
इसलिए वे अपने इनपुट मूल्यों, उनके वापसी मूल्यों और इस तथ्य में समान हैं कि वे दोनों स्थानीयकृत हैं $_
।
आपके विशिष्ट कोड में, दाएं से बाएं जा रहे हैं:
<FILE>
,FILE
फ़ाइलहैंडल द्वारा इंगित फ़ाइल में पंक्तियों को खिसकाता है और एक सूची देता हैgrep
के संदर्भ में,/^use/
हर लाइन को देखता है और रेगुलर एक्सप्रेशन से मेल खाने वाली लाइन के लिए सही रिटर्न देता है। इसलिए,grep
का वापसी मूल्य, उन पंक्तियों की एक सूची है जोuse
से शुरू होती हैं।- आपके
map
के ब्लॉक में (जो केवल उन पंक्तियों पर विचार कर रहा है जो पहले कीgrep
परीक्षा पास कर चुकी हैं): <उल> chomp
$_
से किसी भी अनुगामी स्ट्रिंग को हटा देता है जो$/
(यानी, न्यूलाइन) के वर्तमान मान से मेल खाती है। यह अनावश्यक है, क्योंकि जैसा कि आप नीचे देखेंगे,\w
कभी भी नई पंक्ति से मेल नहीं खाएगा।$_ =~ m/use (\w+)/
एक रेगुलर एक्सप्रेशन है जो कैप्चर समूह मेंuse
के बाद स्पेस, उसके बाद एक या अधिक शब्द वर्णों ([0-9a-zA-Z_]
) की तलाश करता है।$_ =~
बेमानी है, क्योंकि मैच ऑपरेटरm//
डिफ़ॉल्ट रूप से$_
से जुड़ता है।$1
पिछले एक्सप्रेशन से पहला मेल खाने वाला कैप्चर ग्रुप है। चूंकि यह ब्लॉक में अंतिम अभिव्यक्ति है, इसलिए यह मूल्यांकन किए गए प्रत्येक सूची आइटम के लिए वापसी मूल्य के रूप में बबल हो जाता है।
@sets
नामक एक सरणी में संग्रहीत किया जाता है, जिसमें 'set_marvel', 'set_caprion', etc.
होना चाहिएसमान रूप से, आपका कोड बिना map
और grep
के इस तरह फिर से लिखा जा सकता है, जिससे आपके लिए इसे समझना आसान हो सकता है:
my @sets;
while (<FILE>) {
next unless /^use (\w+)/;
push(@sets, $1);
}
संबंधित सवाल
नए सवाल
perl
पर्ल एक प्रक्रियात्मक, उच्च-स्तरीय, सामान्य-प्रयोजन, गतिशील प्रोग्रामिंग भाषा है, जिसे नियमित अभिव्यक्ति और स्ट्रिंग पार्स क्षमताओं के मूल समर्थन के लिए जाना जाता है। कृपया सामान्य रूप से पर्ल के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। नई (लेकिन संबंधित) भाषा Raku (पूर्व में "पर्ल 6") से संबंधित चीजों के लिए, कृपया raku टैग का उपयोग करें। अन्य भाषाओं में पर्ल-स्टाइल नियमित अभिव्यक्तियों के लिए, रेगेक्स टैग का उपयोग करें, या, यदि वे पीसीआरई लाइब्रेरी, पीसीआर टैग पर आधारित हैं।