यह का जवाब "How can I tell whether a certain element is contained in a list or array?" पर उत्तर दिया गया है।
perlfaq को खोजने के लिए, आप अपने पसंदीदा ब्राउज़र का उपयोग कर perlfaq में सभी सवालों की सूची के माध्यम से खोज सकते हैं।
कमांड लाइन से, आप खोजशब्दों की खोज के लिए -q स्विच पर perldoc का उपयोग कर सकते हैं। आप "सूची" को खोजकर अपने जवाब मिल गया है जाएगा:
perldoc -q list
सुनवाई शब्द "में" (इस जवाब ईसा सीगल और ब्रायन डी Foy के योगदान के हिस्से) एक संकेत है कि आपके डेटा को स्टोर करने के लिए शायद आपको हैश, सूची या सरणी का उपयोग नहीं करना चाहिए था। हैश को इस प्रश्न का उत्तर जल्दी और कुशलता से देने के लिए डिज़ाइन किया गया है। Arrays नहीं हैं।
कहा जा रहा है कि, इस दृष्टिकोण के कई तरीके हैं। Perl 5.10 में और बाद में, आप जांच करने के लिए है कि एक आइटम किसी सरणी या एक हैश में निहित है स्मार्ट मैच ऑपरेटर का उपयोग कर सकते हैं:
use 5.010;
if($item ~~ @array)
{
say "The array contains $item"
}
if($item ~~ %hash)
{
say "The hash contains $item"
}
पर्ल के पिछले संस्करणों के साथ
, तो आप में कुछ अधिक परिश्रम करना होगा। आप इस क्वेरी मनमाना स्ट्रिंग मूल्यों में कई बार करने जा रहे हैं, तो सबसे तेज़ तरीका मूल सरणी को उलटने और एक हैश जिसका कुंजी पहली सरणी के मूल्यों हैं बनाए रखने के लिए शायद है:
@blues = qw/azure cerulean teal turquoise lapis-lazuli/;
%is_blue =();
for (@blues) { $is_blue{$_} = 1 }
अब आप चाहे $ जाँच कर सकते हैं is_blue {$ some_color}। ब्लूज़ को सभी जगहों पर हश में रखना एक अच्छा विचार हो सकता है।
यदि मान सभी छोटे पूर्णांक हैं, तो आप एक साधारण अनुक्रमित सरणी का उपयोग कर सकते हैं। एक सरणी इस तरह की कम जगह ले जाएगा:
@primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31);
@is_tiny_prime =();
for (@primes) { $is_tiny_prime[$_] = 1 }
# or simply @istiny_prime[@primes] = (1) x @primes;
अब आप चाहे $ is_tiny_prime [$ some_number] की जाँच करें।
प्रश्न में मानों को स्ट्रिंग्स के बजाय पूर्णांक हैं, तो आप के बजाय बिट श्रृंखला का उपयोग करके काफी अंतरिक्ष के एक बहुत कुछ बचा सकते हैं:
@articles = (1..10, 150..2000, 2017);
undef $read;
for (@articles) { vec($read,$_,1) = 1 }
अब यह देखना होगा कि vec ($ पढ़ते हैं, $ एन, 1) है कुछ $ एन के लिए सच है।
ये विधियां तेजी से व्यक्तिगत परीक्षण की गारंटी देती हैं लेकिन मूल सूची या सरणी के पुन: संगठन की आवश्यकता होती है। यदि आप एक ही सरणी के खिलाफ एकाधिक मानों का परीक्षण करना चाहते हैं तो वे केवल तभी भुगतान करते हैं।
यदि आप केवल एक बार परीक्षण कर रहे हैं, तो मानक मॉड्यूल सूची :: इस उद्देश्य के लिए पहले फ़ंक्शन का निर्यात करें। तत्व को पालने के बाद यह रोककर काम करता है। यह गति के लिए सी में लिखा है, और इसकी पर्ल बराबर इस सबरूटीन की तरह दिखता है:
sub first (&@) {
my $code = shift;
foreach (@_) {
return $_ if &{$code}();
}
undef;
}
गति थोड़ा चिंता का विषय है, तो आम मुहावरा अदिश संदर्भ में ग्रेप (जो आइटम है कि इसकी हालत पारित कर दिया की संख्या देता है) का उपयोग करता है पूरी सूची को पार करने के लिए। हालांकि, आपको यह बताने का लाभ है कि यह कितने मैच मिले, हालांकि।
my $is_there = grep $_ eq $whatever, @array;
यदि आप वास्तव में मिलान करने वाले तत्वों को निकालना चाहते हैं, तो बस सूची संदर्भ में grep का उपयोग करें।
my @matches = grep $_ eq $whatever, @array;
मुझे यकीन है कि मैं सूची के साथ निर्भरता मुद्दे :: util को देखने नहीं कर रहा हूँ लागू। यह पर्ल के साथ मानक है और यदि आप इसे qw/first/(Draegtun के रूप में करते हैं) के साथ उपयोग करते हैं, तो आप केवल एक सबराउटिन आयात करते हैं। – Telemachus
यह एक मुद्दा नहीं है, यह एक व्यक्तिगत वरीयता है। – MaxVT
सूची :: उत्तर के साथ कोई निर्भरता मुद्दा नहीं है। अगर यह मैं था, तो यह स्वीकार्य जवाब होगा। कोर मॉड्यूल का उपयोग करने के लिए अविश्वसनीयता मुझे अंधविश्वास में निहित वरीयता के रूप में हमला करती है। इस मामले में grep {} लगभग उतना ही अच्छा है। – singingfish