4

perl でタブ展開を行うためのコードに遭遇しました。コードは次のとおりです。

1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;

私はそれが機能することをテストしましたが、私は新人すぎてこれを理解できません。または、これを理解するのに役立つ関連資料のポインタをいただければ幸いです。どうもありがとうございました。

4

2 に答える 2

8

Perl では、任意のコードを正規表現の置換式として埋め込むことができます。

$&最後のパターン マッチで一致した文字列です。この場合は、いくつかのタブ文字です。

$`は、最後のパターン マッチで一致した文字列の前にある文字列です。これにより、前のテキストの長さがわかるため、列に適切に配置できます。

たとえば、文字列"Something\t\t\tsomething else"$&is "\t\t\t"、および$`isに対してこれを実行します"Something"length($&)は 3 であるため、最大で 24 個のスペースが必要ですが、length($`)%81 であるため、8 列ごとに配置するには 23 個のスペースが追加されます。

于 2011-04-30T22:46:50.387 に答える
2

正規表現のeフラグは、置換文字列 ( ' ' x (...etc...) を perl コードとして扱い、一致ごとに解釈/実行することを意味します。+したがって、基本的には、1 つ以上 ( ) タブ文字 ( )がある場所を探し\t、小さな perl スニペットを実行してそれらのタブをスペースに変換します。

スニペットは、一致したタブの数を計算し、その数に 8 を掛けて必要なスペースの数を取得しますが、一致したタブの前にある可能性のあるものもすべて考慮します。

于 2011-04-30T22:48:46.147 に答える