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.
我认为你假设正则表达式周围的括号会在其上引入一个列表上下文.事实并非如此.赋值运算符的左侧确定上下文,它是标量.在标量上下文中,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)