मेरा पर्ल नक्शा कुछ भी क्यों नहीं लौटाता है?

जब मैं निम्नलिखित कथन चला रहा हूं:

@filtered = map {s/ //g} @outdata;

it is returning an empty list instead of the filtered list that I expected. What I am trying to do is remove every occurrence of   from an array of string (which is an xml file).

जाहिर है, मैं कुछ समझ नहीं रहा हूँ। क्या कोई मुझे ऐसा करने का सही तरीका बता सकता है, और यह मेरे लिए क्यों काम नहीं कर रहा है?

0
ro fr bn
यह stackoverflow.com/questions/1458454/… लौटाती है, और इसका एक ही जवाब है।
जोड़ा लेखक brian d foy, स्रोत

7 उत्तर

use Algorithm::Loops "Filter";
@filtered = Filter { s/ //g } @outdata;
0
जोड़ा

इसे इस्तेमाल करे:

@filtered = map {s/ //g; $_} @outdata;

समस्या यह है कि perl में s ऑपरेटर $ _ को संशोधित करता है लेकिन वास्तव में किए गए परिवर्तनों की संख्या देता है। इसलिए, अंत में अतिरिक्त $ _ पर्ल को @outdata के प्रत्येक तत्व के लिए संशोधित स्ट्रिंग को वापस करने का कारण बनता है।

0
जोड़ा
पर्ल 5.14 के साथ गैर विनाशकारी प्रतिस्थापन , आप इसे @fdtered = map {s/& nbsp;//gr} @outdata </​​code> जैसे @outdata </​​code> को प्रभावित किए बिना कर सकते हैं।
जोड़ा लेखक brian d foy, स्रोत
मुझे लगता है कि डाउनवोट के लिए पर्याप्त मतलब नहीं है, लेकिन यह एक बुरा विचार है।
जोड़ा लेखक Rob Van Dam, स्रोत
यह कोड @outdata में मानों को ट्रैश करता है।
जोड़ा लेखक Kevin Panko, स्रोत

टिथोनियम के बिंदु पर अनुवर्ती करने के लिए, यह चाल भी करेगा:

@filtered = map {local $_=$_; s/ //g; $_} @outdata;

"स्थानीय" सुनिश्चित करता है कि आप एक प्रतिलिपि पर काम कर रहे हैं, मूल नहीं।

0
जोड़ा

ग्रेग के जवाब के प्रतिद्वंद्वी के रूप में, आप grep का दुरुपयोग कर सकते हैं:

@filtered = grep {s/ //g; 1} @outdata;

ऐसा मत करें।

0
जोड़ा

ध्यान दें कि मानचित्र आपके स्रोत सरणी को भी संशोधित करने जा रहा है। तो आप या तो कर सकते हैं:

map {s/ //g} @outdata;

और @filtered चर को पूरी तरह से छोड़ दें, या यदि आपको मूल को बनाए रखने की आवश्यकता है,

@filtered = @outdata;
map {s/ //g} @filtered;

हालांकि, उस मामले में, यह foreach का उपयोग करने के लिए और अधिक पठनीय हो सकता है:

s/ //g foreach @filtered;
0
जोड़ा
शून्य संदर्भ में map को आम तौर पर खराब रूप माना जाता है और @ filtered {...} के लिए पर कुछ भी नहीं कहता है।
जोड़ा लेखक brian d foy, स्रोत

ग्रेग के जवाब में समस्या है कि यह मूल सरणी को संशोधित करेगा क्योंकि $ _ को अलियोजित किया गया है। आप की जरूरत है:

@filtered = map { (my $new = $_) =~ s/ //g; $new} @outdata;
0
जोड़ा
0
जोड़ा