Perl变量之间的混淆

时间:2012-07-03 08:29:27

标签: perl

我有以下代码

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更改为其他内容吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

不,你不必改变它。匹配后不会保留$ 1,但如果匹配尝试失败,它可能会保留其值。排名可能与您的模式不匹配。试试这个以确保:

my ($rank) = ($content =~ /rank=([\s\S]+?)&/);
die("rankkk") if not defined $rank;

答案 2 :(得分:1)

我相信您关于$1的问题已经得到了解答。以下是正则表达式的简单版本:

/rank=(.+?)&/

通过编写[\s\S],您将组合两个相互补充的字符类。因此,[\s\S]可以替换为.,其匹配除换行符之外的任何字符。

如果文本中的名称和等级信息跨越多行,则可以使用s修饰符,这使得.也匹配\ n。

/rank=(.+?)&/s