我有以下代码:
#$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);
Usualy这个工作正常,但由于某种原因,输出是“public_html 1”而不是“public_html / foo / bar / foobar.html”。
谁能明白为什么?
答案 0 :(得分:11)
您没有得到正确答案,因为替换会返回1,即替换的项目数。请参阅perlfaq4对How can I count the number of occurrences of a substring within a string?
的回答$domain = "domainname.co.uk";
$root = "public_html";
$webpage = "domainname.co.uk/foo/bar/foobar.html";
my $string = ($webpage =~ s/^$domain//g);
print $string."\n";
删除$string
,然后执行$webpage =~ s/^$domain//g;
,然后使用$webpage
进行字符串连接。
答案 1 :(得分:7)
我认为你假设正则表达式周围的括号会在其上引入一个列表上下文。它不的情况。赋值运算符的左侧确定上下文,它是标量。在标量上下文中,s ///返回成功替换的数量。在所声明的变量变量周围加上括号使得它可以按照您的意愿执行,因为它可以生成列表上下文。
此:
my ($string) = $webpage =~ s/^$domain//;
将返回$ webpage的匹配部分:域名。这可能不是你想要的。你要么想要S.Mark的代码:
$webpage =~ s/^$domain//;
my $linkFromRoot = $dbh->quote($root . $webpage);
或者这个
my ($string) = $webpage =~ /^$domain(.+)$//;
my $linkFromRoot = $dbh->quote($root . $string);
答案 2 :(得分:4)
完全偏离原始问题的主题,但您可能真正想要的是:
my $webpage = URI->new("http://domainname.co.uk/foo/bar.html");
my $path = $webpage->rel("http://domainname.co.uk/");
print "public_html/$path\n";
答案 3 :(得分:0)
怎么样
$webpage =~ s/^$domain//g;
my $linkFromRoot = $dbh->quote($root . $webpage);
答案 4 :(得分:0)
如果你不需要另一个变量,我认为上面的答案更好,但我最喜欢的一个小语法技巧是利用赋值是左值这一事实,所以用括号重新排列:
(my $string = $webpage) =~ s/^$domain//g;
您可以在一个声明中复制并修改它。
此外,除了对此代码有点奇怪的其他内容之外,对于以/g
开头的模式,^
没有多大意义。它不能匹配多次。