Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
变量之间的Perl混淆_Perl - Fatal编程技术网

变量之间的Perl混淆

变量之间的Perl混淆,perl,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 tex

我有以下代码

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美元换成别的东西吗?

不,你不必换$1在匹配后不会保留,但是如果匹配尝试失败,它可能会保留其值。排名可能与您的模式不匹配。尝试此操作以确保:

my ($rank) = ($content =~ /rank=([\s\S]+?)&/);
die("rankkk") if not defined $rank;
这样更安全一些,比如:

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
的问题已经得到了回答。下面是一个更简单的regexp版本:

/rank=(.+?)&/
通过编写
[\s\s]
可以组合两个字符类,它们是彼此的补集。因此,
[\s\s]
可以替换为与除换行符以外的任何字符匹配的

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

/rank=(.+?)&/s

/rank=([\s\s]+?)&/
位是否确实匹配?我认为您应该始终将
$1
与匹配的
if
语句结合使用。这并不能解释原始海报返回用户名文本的原因:-)您是对的,当您说“$1…在每次匹配后将有一个新值”。问题是,当第二个表达式不匹配时,
$1
将具有旧值。它不是在每个正则表达式之前初始化的。@perreal:
$1
的值被保留。成功的匹配将修改它,但不成功的匹配将保持不变。不成功的匹配在我的字典中不是匹配:)那么你说的
$1
在匹配后不保留是什么意思?
/rank=(.+?)&/s