32

/eregex修飾子のこの単純な使用法を理解するのに少し問題があります。

my $var = 'testing';
$_ = 'In this string we are $var the "e" modifier.';

s/(\$\w+)/$1/ee;

print;

戻り値:「この文字列では、「e」修飾子をテストしています。」

2つの「e」修飾子が必要な理由がわかりません。私が見る限り、$1は文字列から'$ var'をキャプチャし、単一の'e'修飾子が変数をその値に置き換えることができるはずです。ただし、上記のコードを1つの「e」修飾子だけで試しても文字列内の何も目に見えて置き換えられないため、私は何かを誤解しているに違いありません。

こんな簡単な質問をしてすみません!

ありがとう。

4

3 に答える 3

39

これは正確に「単純な」質問ではないので、自分を殴らないでください。

問題は、単一/eの場合、RHSはそのeval結果が置換に使用されるコードであると理解されることです。

そのRHSは何ですか?です$1。を評価すると、文字列$1が含まれていることがわかります。これには、上記の変数の内容は含まれていません 。その後に、その後に、その後に。が続きます。 $var$var

したがって、2回評価する必要があります。1回はに変換$1し、もう1回$varは前の結果を$var文字列に変換します"testing"これを行うには、演算子にdoubleee修飾子を付けます。s

これは、1つで実行するのと2つで実行するので、非常に簡単に確認でき/eます。これは、両方のデモと、シンボリック逆参照を使用する3番目の方法です。これはパッケージシンボルテーブルを参照するため、パッケージ変数でのみ機能します。

use v5.10;

our $str = q(In this string we are $var the "e" modifier.);
our $var = q(testing);

V1: {
    local $_ = $str; 
    s/(\$\w+)/$1/e;
    say "version 1: ", $_;

}

V2: {
    local $_ = $str;
    s/(\$\w+)/$1/ee;
    say "version 2: ", $_;
}

V3: {
    no strict "refs";
    local $_ = $str;
    s/\$(\w+)/$$1/e;
    say "version 3: ", $_;
}

実行すると、次のようになります。

version 1: In this string we are $var the "e" modifier.
version 2: In this string we are testing the "e" modifier.
version 3: In this string we are testing the "e" modifier.
于 2011-05-21T14:23:29.350 に答える
9

明確にするために、s//eeフォームは正規表現パターンまたは正規表現の解釈をまったく変更していません。これは、正規表現が実行された後の交換用サイドストリングのオプションの処理です。(PERLOP正規表現の引用のような演算子を参照してください)

eまたは、フォームのeePATTERN側の正規表現オプションに混合されますs/PATTERN/REPLACEMENT/msixpodualgcer

Perlopから:

オプションはm//と同じですが、次の置換固有のオプションが追加されています。

e Evaluate the right side as an expression.
ee  Evaluate the right side as a string then eval the result.
r   Return substitution and leave the original string untouched.

この例が示すように、正規表現以外の状況でも同じevsタイプの動作を確認できます。ee

#!/usr/bin/perl 
use warnings;
use strict;

my $var = "var's contents";
my $str='"-> $var <-"';
print eval('$str'), "\n";        # equivalent to s//e
print eval(eval('$str')), "\n";  # equivalent to s//ee

出力:

"-> $var <-"
-> var's contents <-
于 2011-05-21T16:26:02.473 に答える
-1

最新のperlパッケージのrenameユーティリティを次のように試してください。

rename -v 's/\b(\w)/uc($1)/eg' *

ここで、パターン\bは単語の境界を見つけ、e修飾子は置換での評価を有効にしg、すべての出現箇所を置き換えます。

次のように名前をcamelCaseに変更することもできます。

rename -v 's/\b(\w)/uc($1)/eg' *
rename -v 's/^(\w)/lc($1)/e' *
rename -v 's/\s+//g' *
于 2015-06-02T01:28:21.090 に答える