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],您正在组合两个互为补集的字符类。因此,[\s\S]可以替换为.匹配除换行符之外的任何字符。

如果文本中的名称和排名信息跨越多行,您可以使用 s 修饰符,它也可以.匹配 \n。

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