2

ファイル内の URL のリストを検索して置換しようとしていますが、検索 URL に疑問符が含まれていると問題が発生します。以下$fileは単一のタグですが、通常はファイル全体です。

my $search = 'http://shorturl.com/detail.cfm?color=blue';
my $replace = 'http://shorturl.com/detaila.aspx?color=red';
my $file = '<a href="http://shorturl.com/detail.cfm?color=blue" class="news">HI</a>';
$file =~ s/$search/$replace/gis;
print $file;

$search変数に含まれている場合?、置換は機能しません。変数?color=blueからを外すとうまくいきます。$search

上記の置換を機能させる方法を知っている人はいますか? バックスラッシュ、つまり\?役に立ちませんでした。ありがとう。

4

3 に答える 3

8

正規表現パターンにはquotemetaを使用します。

use warnings;
use strict;

my $search = quotemeta 'http://shorturl.com/detail.cfm?color=blue';
my $replace = 'http://shorturl.com/detaila.aspx?color=red';
my $file = '<a href="http://shorturl.com/detail.cfm?color=blue" class="news">HI</a>';
$file =~ s/$search/$replace/gis;
print $file;

__END__

<a href="http://shorturl.com/detaila.aspx?color=red" class="news">HI</a>
于 2013-07-02T13:11:16.290 に答える
4

文字列が正規表現として補間される場合、文字どおりに一致するのではなく、正規表現として解釈されます。これは、複雑な正規表現を構築するのに役立ちます。

my @animals = qw/ cat dog goldfish /;
my $animal_re = join "|", @animals;

say "The $thing is an animal" if $thing =~ /$animal_re/i;

string$animal_reでは、|は正規表現のメタ文字として扱われます。

その他のメタ文字は.、改行以外の任意の文字に一致する や?、前のアトムをオプションにする などです。

変数の内容を文字どおり一致させたい場合は、\Q...\E引用符で囲むことができます。

s/\Q$search/$replace/gi

(この/sオプションは.、「任意の非改行文字に一致する」の意味を「任意の文字に一致する」に変更するだけなので、ここでは関係ありません。)

は関数の\Q...\Eシンタックス シュガーであるため、quotemetaこの回答とtoolic回答はまったく同じです。

于 2013-07-02T13:13:23.530 に答える
1

だけでなくエスケープしたいことに注意してください??あなたの例で期待していたものを台無しにするのはこれだけですが、.一致を見つけるのは難しい場合があります。

正規表現/foo.com/は確かに string に一致しますが、任意の文字に一致するため、 and にも一致foo.comします。したがって、 は のように記述します。foo comfooXcomfoo!com./foo.com//foo\.com/

于 2013-07-02T14:27:14.567 に答える