2009-11-02 19 views
11

Eşleşen bir işlecim varsa, $1, $2 kullanmak yerine, parantez içinde yakalanan dizelerin bölümlerini değişkenler olarak nasıl kaydederim?Eşleşmeleri Perl eşleme operatöründen değişkenlere nasıl çıkarabilirim?

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

Soldan neler geçiyor?

+0

Joachim'in yorumlarına dayanarak soruyu diğer cevaplara tamamen değiştirdim. Normal bir soru değil. –

+0

Soru cümlesiyle, cevabımı düşürdüğünüz anlaşılıyor. – innaM

+0

@brian, buradaki düzenlemeniz muhtemelen daha özlüdür, çünkü sorgum, regexp'in kendisi ile ilgili her şeyden ziyade m // operatörüyle ve etrafında kullanacağı sözdizimi ile ilgilidir. Benim hatam. Ama ben 'ekstresi' kelimesini bir yere koymayı isterim, çünkü bunu nasıl yapacağımı unuttuğumda google'ım olacak! – joachim

cevap

29

hüner bir liste atama kullanarak liste bağlamında m // çalışması yapmaktır:

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

Bu düzgünce olmak daha fazla şeyler, örneğin kapmak için genişletilmiş olabilir:

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

Doğru. Ben her zaman takılıyorum olsa da şeylerin regexp tarafı yerine, adlandırılmış değişkenlere şeyler almak için sözdizimi, bu yüzden örnek ve cevap regexp parçası üzerinde skimped. – joachim

+0

[Ayrıca] (https://perlmaven.com/how-to-extract-strings-from-a-file) '@interesting = $ string ...'? –

3

size Genellikle Ayrıca giriş dizesinin normal ifadenize uyduğundan emin olmak için bir test yapmak istersiniz. Böylece hata durumlarını da halledebilirsiniz.

İlginç bir şeyi çıkarmak için ayıklamak istediğiniz parçayı tutturmanın bir yolunun olması gerekir.

Yani, örnek ile, bu ilk giriş dizesi bizim ifadesini aynı olduğundan emin olun olacak ve daha sonra iki 'sıkıcı' bit arasındaki bit ayıklamak:

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

braketi kullanın oluşturmak için (...) inşa yakalama arabelleği. Daha sonra yakalanan dizeye erişmek için $1, $2, vb. Özel değişkenleri kullanın.

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

Tüm ifadeyi istediğinizde ** bir yakalama grubuna * gerek yok. ** Sadece yerine '$ 0' kullanın.** –

+5

@Peter: Bence şu anki programın adı olan 0 $ 'ı başka bir şeyle karıştırmış olmalısın. –

+0

... aslında tamamen başka bir şeyle. – innaM

0

$ & - Son başarılı desen maçı (şimdiki BLOK çevrili bir BLOK ya eval() içinde gizli herhangi bir eşleşme hariç) ile eşleşen dize.

#! /usr/bin/perl 

use strict; 
use warnings; 

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

$ & kullanmayın. Özellikle bu durumda, metinsel metni eşleştiriyorsanız, hiç eşleşmeniz gerekmez. Zaten $ ve olmadan cevabı biliyorsunuz. –

2

Sen adlı yakalama tamponlarını kullanabilirsiniz:

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

@strings sol tarafta durur ve sonucu içerecektir, sonra giriş dizesi $input_string gider. Tüm alt dizeleri eşleştirmek için bayrağı g unutma.

my @strings=$input_string=~m/stuff (.*) stuff/g; 
İlgili konular