2010-09-06 17 views
37

की एक पंक्ति में परिणाम असाइन करें मैं एक चर पर एक regex मैच करने में सक्षम होना चाहता हूं और परिणामों को चर को स्वयं असाइन करना चाहता हूं। यह करने के लिए सबसे अच्छा तरीका क्या है?मिलान regex और कोड

मैं अनिवार्य रूप से कोड की एक पंक्ति में लाइनों 2 और 3 संयोजित करना चाहते हैं:

$variable = "some string"; 
$variable =~ /(find something).*/; 
$variable = $1; 

वहाँ एक छोटी/सरल यह करने के लिए रास्ता नहीं है? क्या मैं कुछ भूल रहा हूँ?

$a = 'stackoverflow'; 
$a =~ s/(\w+)overflow/$1/; 

$a अब "stack"

उत्तर

24

आप इसे कम क्यों करना चाहते हैं? क्या वास्तव में कोई फर्क पड़ता है?

$variable = $1 if $variable =~ /(find something).*/; 

आप चर नाम या बार-बार ऐसा करने के बारे में चिंतित हैं, तो एक सबरूटीन में बात लपेट और इसके बारे में भूल जाते हैं:

some_sub($variable, qr/pattern/); 
sub some_sub { $_[0] = $1 if eval { $_[0] =~ m/$_[1]/ }; $1 }; 

लेकिन अगर आप इसे लागू, सबरूटीन की बात करने के लिए है इसे पुन: उपयोग करने योग्य बनाएं ताकि आप लाइनों का एक विशेष सेट एक छोटा नाम दें जो उनके स्थान पर खड़ा हो।

7

आप रूप से प्रतिस्थापन कर सकते हैं।

$variable =~ s/.*(find something).*/$1/; 

AFAIK, तुम हमेशा मान की प्रतिलिपि करने के लिए हालांकि, जब तक आप मूल मार करने के लिए परवाह नहीं है होगा।

+0

इसमें कोई समस्या है, यह केवल मूल चर को प्रतिस्थापित करेगा यदि संपूर्ण स्ट्रिंग खोज पैटर्न में मौजूद है। अगर मैं उपयोग करना चाहता था, कहूं,/(\ w +) मिलान के लिए/ऊपर, यह काम नहीं करेगा। –

+0

पैटर्न मनमाने ढंग से है, मिलान एक पंक्ति या शब्द सीमा पर शुरू या शुरू नहीं होता है। किसी भी मामले में, धन्यवाद, मुझे लगता है कि ऐसा करने का कोई स्पष्ट तरीका नहीं है। मेरी प्राथमिक चिंता यह थी कि मुझे इसे अक्सर करना है, और यह दोहराव दिखता है। –

+0

Google के माध्यम से इस 2 साल के पुराने धागे पर ठोकर खाई, और मुझे लगता है कि यह सही जवाब है। बस अपनी जरूरतों को पूरा करने के लिए रेगेक्स संपादित करें: /.* (कुछ ढूंढें)। * ​​/ $ 1 /; – Mintx

4

लगभग है ....

आप मैच गठबंधन और एक प्रतिस्थापन के साथ मिलान मान प्राप्त कर सकते हैं:

6

ठीक है, आप कह सकते हैं

my $variable; 
($variable) = ($variable = "find something soon") =~ /(find something).*/; 

या

(my $variable = "find something soon") =~ s/^.*?(find something).*/$1/; 
+0

मैं स्पष्टता के लिए अलग-अलग चर परिभाषा का उपयोग करना चाहता हूं, लेकिन हाँ यह त्वरित खोजों के लिए एक अच्छा समाधान है। धन्यवाद। –

3

मैं यह कर:

#!/usr/bin/perl 

$target = "n: 123"; 
my ($target) = $target =~ /n:\s*(\d+)/g; 
print $target; # the var $target now is "123" 
52
my($variable) = "some string" =~ /(e\s*str)/; 

यह काम करता है क्योंकि

/g विकल्प का प्रयोग नहीं किया जाता है, तो m// सूची संदर्भ में subexpressions पैटर्न में कोष्ठक, अर्थात, ($1, $2, $3 ...) के अनुरूप से मिलकर एक सूची देता है।

और my($variable) = ... (स्केलर के चारों ओर कोष्ठक नोट करें) मैच के लिए सूची संदर्भ संदर्भ प्रदान करता है।

यदि पैटर्न मिलान करने में विफल रहता है, $variable अपरिभाषित मान प्राप्त करता है।

+0

सूची संदर्भ में विवरण जोड़ने के लिए। ओओओ 'my ($ foo) = (" बार बॉक्स "= ~/(साबुन | बॉक्स) /) के बराबर है;' – vol7ron

+0

मैं एक और उदाहरण भी जोड़ूंगा। यदि आप एक ही कॉल में परिणामों में स्ट्रिंग को प्रीपेड करना चाहते हैं: 'मेरा ($ foo) = map ("उपसर्ग _ $ _", @ {["बार बॉक्स" = ~/(साबुन | बॉक्स) /)]}) ; '। आप इस मामले में "prefix_box" के साथ समाप्त हो जाएगा। – vol7ron

+2

यह स्वीकार्य उत्तर होना चाहिए! – mrfred

4
$variable2 = "stackoverflow"; 
(my $variable1) = ($variable2 =~ /stack(\w+)/); 

$variable1 अब "overflow" बराबर होती है।

संबंधित मुद्दे