【问题标题】:Why does Perl replace my string with "1"?为什么 Perl 用“1”替换我的字符串?
【发布时间】:2010-02-06 09:00:21
【问题描述】:

我有以下代码:

#$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);

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

谁能明白为什么?

【问题讨论】:

  • 当您遇到这些问题时,请开始将您的代码一分为二,找出问题数据出现的位置。在这种情况下,您将在使用之前检查$string 的值,找出它是1,然后阅读替换运算符以查看它在做什么。 :)
  • 又跑题了,但为什么是 DBI quote 而不是占位符? :)

标签: regex perl string replace


【解决方案1】:

您没有得到正确答案,因为替换返回 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进行字符串连接。

【讨论】:

    【解决方案2】:

    我认为您假设正则表达式周围的括号会在其上产生一个列表上下文。它不是的情况。赋值运算符的左边决定了上下文,它是标量的。在标量上下文中,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);
    

    【讨论】:

    • 我喜欢您解释理解上下文时可能出现的错误。 Perl 中的一个主题太重要了,不能错过加强它的机会。
    【解决方案3】:

    完全脱离了您最初问题的主题,但您真正想要的是:

    my $webpage = URI->new("http://domainname.co.uk/foo/bar.html");
    my $path = $webpage->rel("http://domainname.co.uk/");
    print "public_html/$path\n";
    

    【讨论】:

      【解决方案4】:

      怎么样

      $webpage =~ s/^$domain//g;
      my $linkFromRoot = $dbh->quote($root . $webpage);
      

      【讨论】:

        【解决方案5】:

        如果您不需要另一个变量,我认为上面的答案更好,但我最喜欢的小语法技巧之一是利用赋值是左值这一事实,因此对括号进行一些重新排列:

        (my $string = $webpage) =~ s/^$domain//g;
        

        您可以在一个语句中复制并修改它。

        此外,除了这段代码有点奇怪的其他内容之外,在以^ 开头的模式上,/g 并没有多大意义。它不能匹配不止一次。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-26
          • 2019-01-15
          • 1970-01-01
          • 1970-01-01
          • 2014-10-06
          • 2012-09-21
          • 1970-01-01
          • 2014-05-24
          相关资源
          最近更新 更多