1

次のように、パターン内で変数を使用できます

if ($param =~ /^${param}$/)

しかし、パターン内で数式を使用して、このようなものを取得するにはどうすればよいですか (構文が正しくありません) >>

if ($param =~ /^0*{param+0}$/)

可能..?

4

2 に答える 2

3

shopping-cart pseudooperator を介して、任意の式の結果を補間できます@{[ ... ]}。のようなデレレレンス オペレータに@{ ... }は、任意のコード ブロックを含めることができます。最後のステートメントが配列参照 (または${ ... }:scalarref) に評価されることを確認してください。

例として:

my ($foo, $bar, $baz) = (3, 5, 7);
local $_ = "22, oh whatever";
if (/^@{[ $foo * $bar + $baz ]}.+whatever/) { say "ok" }

編集

上記の解決策は、任意の補間引用演算子 ( qqqrqx) に対して機能しますが、正規表現にはコードを埋め込む追加の可能性があります(??{ ... })。違いは、コードが評価されるときです。

  • @{[ ... ]}Perlステートメントの実行時/パターンのコンパイル時にコードを評価します
  • (??{ ... })パターン内のその位置に達したときにコードを評価します。結果はパターンとして使用されます。これは、バックトラッキングにより、コードがマッチごとに複数回評価される可能性があることを意味します。

この場合、パターン

/^(??{ $foo * $bar + $baz }).+whatever/

コードによって生成されたパターンのバックトラッキングが発生しないため、上記の正規表現と同等です。

于 2013-06-28T18:51:55.593 に答える