2009-11-02 15 views
11

यदि मेरे पास एक मैच ऑपरेटर है, तो मैं $1, $2 का उपयोग करने के बजाय चर में कोष्ठक में कैप्चर किए गए तारों के हिस्सों को कैसे सहेजूं, और इसी तरह?मैं पर्ल मैच ऑपरेटर से मैचों को चर में कैसे निकाल सकता हूं?

... = m/stuff (.*) stuff/; 

बाईं ओर क्या चल रहा है?

+0

मैंने पूरी तरह से joachim की टिप्पणियों के आधार पर प्रश्नों को अन्य उत्तरों पर बदल दिया है। यह एक regex सवाल नहीं है। –

+0

इस तरह के प्रश्न वाक्यांश के साथ, यह समझ में आता है कि आपने मेरा जवाब कम कर दिया है। – innaM

+0

@brian, आपका संपादन शायद अधिक संक्षेप में है, क्योंकि मेरा प्रश्न पूरी तरह से regexp के साथ कुछ भी करने के बजाय m // ऑपरेटर के साथ और उसके आसपास उपयोग करने के लिए सिंटैक्स के बारे में था। मेरी गलती। लेकिन मैं वहां कहीं भी 'निकालने' शब्द को रखना चाहता हूं, क्योंकि जब मैं भूल जाता हूं कि यह कैसे करना है, तो मैं यही कहूंगा! – joachim

उत्तर

29

चाल एक सूची असाइनमेंट का उपयोग करके सूची संदर्भ में मीटर // काम करने के लिए है:

($interesting) = $string =~ m/(interesting)/g; 

यह बड़े करीने से किया जा सकता है और बातें, जैसे हड़पने के लिए बढ़ाया:

($interesting, $alsogood) = $string =~ m/(interesting) boring (alsogood)/g; 
+0

सच है। हालांकि मैं जिस चीज पर हमेशा अटक जाता हूं वह चीजों के regexp पक्ष की बजाय नामित चर में सामान प्राप्त करने के लिए वाक्यविन्यास है, इसलिए मैं उदाहरण और उत्तर के regexp भाग पर skimped। – joachim

+0

[इसके अलावा] (https://perlmaven.com/how-to-extract-strings-from-a-file) '@ रुचि = $ स्ट्रिंग ...'? –

3

आमतौर पर आप यह भी सुनिश्चित करने के लिए एक परीक्षण करना चाहते हैं कि इनपुट स्ट्रिंग आपकी नियमित अभिव्यक्ति से मेल खाती है। इस तरह आप त्रुटि मामलों को भी संभाल सकते हैं।

कुछ रोचक निकालने के लिए आपको निकालने में रुचि रखने वाली बिट को लंगरने के लिए कुछ रास्ता भी होना चाहिए।

तो, अपने उदाहरण के साथ, यह पहले सुनिश्चित करें कि इनपुट स्ट्रिंग हमारे अभिव्यक्ति से मेल खाता है, और फिर दो 'उबाऊ' बिट्स के बीच थोड़ा निकालें:

$input = "boring interesting boring"; 
if($input =~ m/boring (.*) boring/) { 
    print "The interesting bit is $1\n"; 
} 
else { 
    print "Input not correctly formatted\n"; 
} 
8

bracketing का प्रयोग करें (...) का निर्माण एक बनाने के लिए बफर कैप्चर करें। फिर कैप्चर स्ट्रिंग तक पहुंचने के लिए विशेष चर $1, $2 आदि का उपयोग करें।

if (m/(interesting)/) { 
    my $captured = $1; 
} 
+0

जब आप पूरी अभिव्यक्ति चाहते हैं तो आपको ** कैप्चरिंग समूह की आवश्यकता नहीं है **। ** बस इसके बजाय '$ 0' का उपयोग करें।** –

+5

@ पीटर: मुझे लगता है कि आपको किसी अन्य चीज़ के साथ $ 0, वर्तमान कार्यक्रम का नाम उलझन में होना चाहिए। –

+0

... वास्तव में कुछ और, वास्तव में। – innaM

0

$ & - स्ट्रिंग पिछले सफल पैटर्न मैच ( किसी भी एक ब्लॉक या eval() वर्तमान ब्लॉक से घिरा के भीतर छिपा मैचों की गिनती नहीं) के अनुरूप।

#! /usr/bin/perl 

use strict; 
use warnings; 

my $interesting; 
my $string = "boring interesting boring"; 
$interesting = $& if $string =~ /interesting/; 
+4

$ और $ का उपयोग न करें। विशेष रूप से इस मामले में, यदि आप शाब्दिक पाठ से मेल खाते हैं, तो आपको बिल्कुल मेल नहीं करना पड़ेगा। आप पहले ही $ और बिना उत्तर के जवाब जानते हैं। –

2

आप नामित कब्जा बफ़र्स उपयोग कर सकते हैं:

if (/ (?<key> .+?) \s* : \s* (?<value> .+) /x) { 
    $hash{$+{key}} = $+{value}; 
} 
1

@strings बाईं तरफ चला जाता है और परिणाम में शामिल होंगे, तो अपने इनपुट स्ट्रिंग $input_string चला जाता है। सभी सबस्ट्रिंग्स से मेल खाने के लिए ध्वज g को न भूलें।

my @strings=$input_string=~m/stuff (.*) stuff/g; 
संबंधित मुद्दे