我有以下代码
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更改为其他内容吗?
答案 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