मैंने एक सरणी soc_data(@soc_data) में एक पूर्ण फ़ाइल को बफ़र किया है। अब मैं फ़ाइल की प्रत्येक पंक्ति में एक पैटर्न बनाने की कोशिश कर रहा हूं या हम सरणी के प्रत्येक तत्व को कह सकते हैं।

मैंने इसका उपयोग किया है। लेकिन यह ठीक से काम नहीं कर रहा है और झंडा हमेशा 1 होता है, लेकिन इसे टॉगल करना चाहिए क्योंकि पैटर्न हर पंक्ति में मौजूद नहीं है बल्कि केवल कुछ पंक्तियों में है।

my $flag = 0 ;
if(grep("  ".$val." ".$instance, @soc_data)){
  $flag = 1 ;
}
else {
 $flag = 0 ;
}

कृपया इसे करने का तरीका सुझाएं और गलती जो मैं यहां कर रहा हूं।

0
Chaitanyh Singh 11 जुलाई 2018, 16:31
रुचिकर: perlmaven.com/how-to-grep-a-file -use-perl मुझे संदेह है कि समान SO प्रश्न भी हैं।
 – 
user1531971
11 जुलाई 2018, 17:07

2 जवाब

यह आपके द्वारा लिखे गए कोड के साथ टॉगल नहीं कर सकता है। आपका कोड जांचता है कि सरणी में पैटर्न की कोई घटना है या नहीं। grep बारी-बारी से प्रत्येक पंक्ति (सरणी में तत्व) को देखेंगे, और पैटर्न से मेल खाने वालों की सूची लौटाएं। फिर आपका झंडा लगा दिया गया और आपका काम हो गया।

my @list = ( 1 .. 20 );
my @match = grep /3/, @list;
print "@match";

# 3 13

यदि आप प्रत्येक पंक्ति को व्यक्तिगत रूप से करना चाहते हैं, तो आपको बाहरी लूप में स्वयं को सरणी पर लूप करना होगा, और फिर एक मिलान करना होगा। तब grep की कोई आवश्यकता नहीं है।

foreach my $line (@soc_data) {
    my $flag = 0;
    $flag = 1 if $line =~ m/  $val $instance/; # you might want to use \s

    # do things with $flag
}
5
simbabque 11 जुलाई 2018, 16:41
1
पुनः "my $flag = 0; $flag = 1 if $line =~ m/ $val $instance/;", या केवल my $flag = $line =~ / $val $instance/;
 – 
ikegami
12 जुलाई 2018, 05:29
इसे जोड़ने के लिए धन्यवाद। मैंने इसे उत्तर में नहीं डालने का फैसला किया था क्योंकि ओपी के पास if निर्माण था और मैं इसके साथ रहना चाहता था। किसी तरह ऐसा लगा कि वे मैच का रिटर्न वैल्यू लेने की तुलना में इसके साथ अधिक सहज होंगे।
 – 
simbabque
12 जुलाई 2018, 16:19

grep अक्सर स्ट्रिंग्स की सूची में रेगुलर एक्सप्रेशन लागू करने के लिए उपयोग किया जाता है, लेकिन पर्ल में grep उससे अधिक सामान्य है, और आपको स्पष्ट रूप से एक रेगुलर एक्सप्रेशन का उपयोग करना चाहिए यदि आप इसका उपयोग करना चाहते हैं grep के लिए। तुलना करना:

@list = (7,8,9,10);
print grep /1/, @list;        # 10 -- only "10" matches /1/
print grep 1, @list;          # 7 8 9 10, EXPR is always true

grep का आपका उपयोग दूसरे मामले की तरह है। grep के लिए पहला तर्क सिर्फ एक गैर-रिक्त और गैर-शून्य अदिश है, इसलिए यह हमेशा "सत्य" होता है और grep का वापसी मूल्य हमेशा सूची में प्रत्येक तत्व होता है। मुझे संदेह है कि आप कुछ ऐसा चाहते हैं

if (grep / $val $instance/, @soc_data) { ... }

या अगर $val और $instance में रेगेक्सपी मेटाएक्टैक्टर हो सकते हैं,

if (grep / \Q$val\E \Q$instance\E/, @soc_data) { ... }

(मैं वास्तव में नहीं जानता कि "टॉगलिंग" से आपका क्या मतलब है, इसलिए शायद मैंने आपके प्रश्न के उस हिस्से को ठीक से संबोधित नहीं किया है)

1
mob 11 जुलाई 2018, 18:46