7

2つのパターンの間に数字を挿入したいと思います。

$s = 'id="" value="div"';
$s =~ s/(id=")(".*)/$1123$2/;

もちろん、結果としてエラーと「value="div」が発生しました。期待される結果はid="123" value="div"です。

代わりに、私は$ 1、次に番号123、次に$ 2を意味しましたが、$1123、次に$2ではありませんでした。正規表現の正しい置換は何ですか?1つの正規表現でそれを実行したいと思います。

ありがとう。

4

2 に答える 2

16
$s =~ s/(id=")(".*)/$1123$2/;  # Use of uninitialized value $1123 in concatenation (.) or string

の代わりになると期待していましたが$1、perlはそれを変数と見なします$1123。Perlには、あなたが意図したことを知る方法がありません$1。したがって、次のように指定して、変数化をに制限する必要があります。$1${1}

$s =~ s/(id=")(".*)/${1}123$2/;

スクリプトの先頭に次のものを含めることをお勧めします。彼らはあなたに多くの時間と労力を節約します。

use strict;
use warnings;

たとえば、上記のモジュールを含めてスクリプトを実行すると、エラーメッセージが表示されます。

Use of uninitialized value $1123 in concatenation (.) or string at /tmp/test.pl line 7.

(報告されたスクリプト名と行番号は無視してください。)Perlが何を期待していたかを明確に示しています。

後読みおよび先読みアサーションを使用する別のアプローチ:

$s =~ s/(?<=id=")(?=")/123/;
于 2012-08-01T15:35:05.373 に答える
1

別のバリアント:

$s =~ s/(id=")(".*)/$1."123".$2/e;

使用例:

$ cat 1.pl
$s = 'id="" value="div"';
$s =~ s/(id=")(".*)/$1."123".$2/e;
print $s,"\n";

$ perl 1.pl
id="123" value="div"
于 2012-08-01T15:39:15.963 に答える