-1

以下は私のコードです:

my $string1 = '<td><a href="http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3">abcdefg</a><br />(123456)</td>';
my $string2 = 'http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3';


print "Before string substitution:\n$string1\n";
$string1 =~ s/$string2//;
print "After string substitution:\n$string1\n"; 

そして実際の出力:

Before string substitution:
<td><a href="http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3">abcdefg</a><br />(123456)</td>
After string substitution:
<td><a href="http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3">abcdefg</a><br />(123456)</td> 

私が期待すること:

Before string substitution:
<td><a href="http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3">abcdefg</a><br />(123456)</td>
After string substitution:
<td><a href="">abcdefg</a><br />(123456)</td> 

誰かが私のコードの何が問題なのか教えてもらえますか?

ありがとう。

4

2 に答える 2

2

この問題は、スクリプトに 2 つの文字を追加することで解決できます。必要なのは、次のメタ文字をエスケープすることです$string2

$string1 =~ s/\Q$string2//;

一致が失敗する原因となる文字は疑問符?です。ここでエスケープされていない...aspx?...文字は、「文字 'x' の 0 または 1 に一致する」ことを意味します。文字.は、改行以外のすべてに一致するワイルドカードであり、誤検出の一致を引き起こす可能性があります。スラッシュ/は、置換演算子 の区切り文字であるためメタ文字ですs///が、文字列に埋め込まれているため、エスケープする必要はありません。

メタ文字のエスケープは、\Q ... \Eエスケープ シーケンス、正規表現内、またはquotemeta.

これらの種類の文字列を手動でエスケープしようとするのは得策ではありません。特にリテラルの一致が必要な場合はなおさらです。

于 2013-03-13T03:59:51.203 に答える
1

perl 正規表現によって特殊文字と見なされる文字を入力しているため、次のようにエスケープする必要があります。

my $string2 = 'http:\/\/www\.aaa\.com\/downloads\/details\.aspx\?FamilyID=a1b2c3';

次に、プログラムを実行すると、期待される出力が表示されます。

<td><a href="http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3">abcdefg</a><br />(123456)</td>
After string substitution:
<td><a href="">abcdefg</a><br />(123456)</td>

これらの文字を文字列からエスケープするには、perl のquotemeta関数を使用するのが最善です:

my $string2 = quotemeta('http://www.aaa.com/downloads/details.aspx?FamilyID=a1b2c3');

これにより、特殊文字がエスケープされ、正規表現の置換が正常に機能します。

編集

エスケープされていない正規表現文字が原因で問題が発生しているため、文字をエスケープする必要がないため、この解決策はより簡単になる可能性があります。

substr($string1, index($string1,$string2), length($string2)) = '';

これは、次の例に基づいています。

my $name = 'fred';
substr($name, 4) = 'dy'; # $name is now 'freddy'

substrの perldocs にあります。

于 2013-03-13T03:49:29.643 に答える