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

时间:2010-02-06 09:00:21

标签: regex perl string 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);

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

谁能明白为什么?

5 个答案:

答案 0 :(得分:11)

您没有得到正确答案,因为替换会返回1,即替换的项目数。请参阅perlfaq4How 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开头的模式,^没有多大意义。它不能匹配多次。