为什么Perl用"1"替换我的字符串?

Phi*_*son 5 regex string perl replace

我有以下代码:

#$domain = domainname.co.uk
#$root = public_html
#$webpage = domainname.co.uk/foo/bar/foobar.html
my $string = ($webpage =~ s/^$domain//g);
my $linkFromRoot = $dbh->quote($root . $string);
Run Code Online (Sandbox Code Playgroud)

Usualy这个工作正常但由于某种原因输出是"public_html 1"而不是"public_html/foo/bar/foobar.html".

谁能明白为什么?

gho*_*g74 11

您没有得到正确的答案,因为替换会返回1,即替换的项目数.请参阅perlfaq4的答案如何计算字符串中子字符串的出现次数?

$domain = "domainname.co.uk";
$root = "public_html";
$webpage = "domainname.co.uk/foo/bar/foobar.html";
my $string = ($webpage =~ s/^$domain//g);
print $string."\n";
Run Code Online (Sandbox Code Playgroud)

删除$string并执行$webpage =~ s/^$domain//g;,然后执行字符串连接$webpage.


Leo*_*ans 7

我认为你假设正则表达式周围的括号会在其上引入一个列表上下文.事实并非如此.赋值运算符的左侧确定上下文,它是标量.在标量上下文中,s ///返回成功替换的数量.在所声明的变量变量周围加上括号使得它可以按照您的意愿执行,因为它可以生成列表上下文.

这个:

my ($string) = $webpage =~ s/^$domain//;
Run Code Online (Sandbox Code Playgroud)

将返回$ webpage的匹配部分:域名.这可能不是你想要的.你要么想要S.Mark的代码:

$webpage =~ s/^$domain//;
my $linkFromRoot = $dbh->quote($root . $webpage);
Run Code Online (Sandbox Code Playgroud)

或这个

my ($string) = $webpage =~ /^$domain(.+)$//;
my $linkFromRoot = $dbh->quote($root . $string);
Run Code Online (Sandbox Code Playgroud)