2010-11-23 4 views
3

Perlの正規表現の括弧内の一致(つまり$1$2$3など)に配列としてアクセスする方法があったのを覚えているようですが、今はできませんそれを見つけるようです。 @+@-のどちらも意味しません。括弧でくくられた配列(Perl)

編集: 私はそうのように、私はs///(置換)内でこの配列にアクセスすることを追加する必要があります(私が探している配列した@!場合)

s/(foo)(bar)+(baz)/mySubst(@!)/e; 

+0

あなたはソファーの下を見ましたか? – Ether

答えて

5

私は、括弧内のグループのすべてを保持している組み込みの魔法の配列を認識していないけど、それはものを作るからあなたを停止しない:

ここ
{package Match::Parens; 
    sub TIEARRAY {bless []} 
    sub FETCH {no strict 'refs'; ${$_[1] + 1}} 
    sub FETCHSIZE {$#+} 
    tie @!, __PACKAGE__; 
} 

sub mySubst {join ', ' => map ucfirst, @_} 

my $str = 'foobarbarbaz'; 

$str =~ s/(foo)(bar)+(baz)/mySubst(@!)/e; 

say $str; # prints 'Foo, Bar, Baz' 

我々はMatch::Parensは新しいになることを宣言結合した@!配列の実装。それがアクセスされるたびに、そのインデックスで現在の一致を検索します。現在の実装は配列のように0から始まり、$1, $2, $3のように1から開始するように変更することができます。

1

@array = $ foo =〜m /(あなたの)(reg)(exp)/;

+0

これは私が欲しいものですが、 's ///'で使用できるようにする必要があります...質問への自分の編集を参照してください – JoelFan

1

グローバルマッチングフラグでどのように動作するか考えていますか?

@matches = /x(.+?)y/g; # Matching against $_ 

マッチには、一致する文字列の配列要素が含まれます。

あなたが何を参照しているのか聞いたことがありません。 This linkは、あなたがしようとしていることを達成するのに役立つ情報を提供する場合があります。

0

これは回避策です。参照としてアクセスすることもできます。

s/(foo)(bar)+(baz)/mySubst([$1,$2,$3,$4])/e; 

これは、一致する要素の上限を知っていればうまくいくでしょう。この解決法は警告で壊れません。

関連する問題