मुझे यह कोड एक स्क्रिप्ट में मिला, क्या आप कृपया बता सकते हैं कि 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...
-5
rodee 22 जिंदा 2016, 01:47

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);
    }
    
    6
    Matt Jacob 22 जिंदा 2016, 03:39