2

次のコードがあります

my $content = $response->content;
$content =~ /username=([\s\S]+?)&/;
my $username = $1;
print $username; #Prints the text

これをもう一度やりたいとしましょうが、別のテキストに対して

例えば

$content =~ /rank=([\s\S]+?)&/;
my $rank = $1;
print $rank; #Prints the username text

$1 を別のものに変更する必要がありますか?

4

3 に答える 3

9
my $content = $response->content;
$content =~ /username=([\s\S]+?)&/;
my $username = $1;
print $username; #Prints the text

$content =~ /rank=([\s\S]+?)&/;

#if the above regex does not match, $1 remains set to the previous $1

my $rank = $1;
print $rank; #Prints the username text

次のような方が安全です。

if ($content =~ /rank=([\s\S]+?)&/){
    my $rank = $1;
}

または、よりエレガントに:

my ($rank) = $content =~ /rank=([\s\S]+?)&/;
print "\n rank:$rank" if defined $rank; #Prints the username text
于 2012-07-03T08:36:19.100 に答える
2

いいえ、変更する必要はありません。$1 は一致後に保持されませんが、一致の試みが失敗した場合はその値を保持する場合があります。ランクがパターンに一致しない可能性があります。これを試して確認してください:

my ($rank) = ($content =~ /rank=([\s\S]+?)&/);
die("rankkk") if not defined $rank;
于 2012-07-03T08:32:01.257 に答える
1

についてのあなたの質問$1はすでに回答されていると思います。正規表現のより単純なバージョンは次のとおりです。

/rank=(.+?)&/

書く[\s\S]ことで、互いに補集合である 2 つの文字クラスを組み合わせることになります。そのため、改行以外の任意の文字に一致する[\s\S]に置き換えることができます。.

テキスト内の名前とランクの情報が複数行にまたがる場合は、s 修飾子を使用できます。これにより、.\n も一致します。

/rank=(.+?)&/s
于 2012-09-24T08:59:14.353 に答える