1

正規表現で置換文字列として使用したい属性を含む Perl Moose オブジェクトを取得しました。アイデアは、次のようなものを使用することです:

$full_string =~ s{FIND_THIS}{$self->replace_string};

$self->replace_string使用する Moose オブジェクトの属性はどこにありますか。上記のように実行すると、期待どおりに動作しません。正規表現エンジンは、'$self' が変数であり、'->' 矢印が単なる文字列であると認識しています。属性の値の代わりに、置換の出力は次のようになります。

ObjectName=HASH(0x7ff458f70778)->replace_string

これを克服する簡単な方法は、文字列を新しい変数にドロップすることです。例えば:

my $new_replace_string = $self->replace_string;
$full_string =~ s{FIND_THIS}{$new_replace_string};

私の質問は、新しい変数の作成を回避し、オブジェクトの属性を直接使用する方法があるかどうかです。(そして、理想的には、コード行を追加する必要はありません。) これは可能ですか?

4

3 に答える 3

4

最も簡単な方法は、置換式が評価する Perl コードであることを Perl に伝えることです。置換値は、そのコードによって返される値になります。

$full_string =~ s{FIND_THIS}{$self->replace_string}e;

しかし、式の結果を文字列リテラルに補間するトリックが存在します (これが置換式です)。

$full_string =~ s{FIND_THIS}{${\( $self->replace_string )}/;

また

$full_string =~ s{FIND_THIS}{@{[ $self->replace_string ]}/;

アイデアは、参照を作成し、逆参照を使用して補間することです。最初に、式はスカラー コンテキストで評価されます。後者では、リスト コンテキストで。

于 2012-06-14T17:03:37.980 に答える
2

/es/// の右側を式として評価します。

$full_string =~ s/FIND_THIS/$self->replace_string/e;
于 2012-06-14T16:45:16.147 に答える
1

はい、evalスイッチ( /e) をスローできます。

$full_string =~ s{FIND_THIS}{$new_replace_string}e;
于 2012-06-14T16:46:02.803 に答える