2009-11-02 11 views
11

私は一致演算子を持っていますが、$1$2などの代わりに、カッコで取り込まれた文字列の部分を変数に保存するにはどうすればよいですか?Perlマッチ演算子から変数にマッチを抽出するにはどうすればよいですか?

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

左側に何がありますか?

+0

私は、joachimのコメントに基づく質問を他の回答に完全に置き換えました。これは正規表現の問題ではありません。 –

+0

そのような疑問文で、あなたは私の答えを落としたように思えます。 – innaM

+0

@brian、あなたの編集はおそらくより簡潔です。私の質問は、正規表現そのものではなく、m //演算子の前後で使用する構文に関するものだったからです。私の悪い。しかし、私は「エキス」という言葉をどこかに戻したいと思っています。これは、私がこれをやる方法を忘れてしまったときに私がGoogleにしてくれるものです! – joachim

答えて

29

トリックは、リストの割り当てを使用して、リストコンテキストでM //仕事をすることです:

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

このきちんとより多くのものをつかむために拡張することができ、例えば:

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

真。 私はいつも立ち往生していますが、物事の正規表現の側ではなく、名前付き変数に物を入れるための構文です。したがって、例と答えの正規表現の部分を詮索しました。 – joachim

+0

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

3

通常あなたがまた、入力文字列が正規表現と一致するかどうかをテストする必要があります。このようにして、エラーのケースも処理できます。

興味深いものを抽出するには、抽出したいビットを固定する方法が必要です。

だから、あなたの例で、これは最初の入力文字列は、私たちの表現に一致していることを確認し、その後、2つの「退屈」ビット間のビットを抽出:

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

は、ブラケットを使用して作成する(...)を構築しますキャプチャバッファ。次に、特別な変数$1$2などを使用して、取得した文字列にアクセスします。

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

**表現全体が必要な場合は**キャプチャグループ**は必要ありません。 **代わりに '$ 0'を使用してください。** –

+5

@Peter:私はあなたが現在のプログラムの名前である$ 0を何か他のものと混同していなければならないと思います。 –

+0

...実際にはまったく別のもので。 – innaM

0

$ & - 最後 成功したパターンマッチ(現在のBLOCKで囲まれたBLOCKや の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; 
関連する問題