在Perl中,如何只替换字符串的第一个字符?

时间:2010-10-06 09:36:38

标签: perl string

我不知道一点点Perl并且必须修复Perl脚本中的错误。

给定包含字符串的变量$myvar,如果第一个字符是点,则将其替换为“foo / bar”。

我该怎么做?
(如果你能猜到这个bug,可以获得奖励积分)

4 个答案:

答案 0 :(得分:9)

$myvar =~ s+^\.+foo/bar+ ;

答案 1 :(得分:8)

您可以使用substr

 substr($myvar, 0, 1, "foo/bar") if "." eq substr($myvar, 0, 1);

答案 2 :(得分:5)

一些substr魔术:

$_ eq '.' and $_ = "foo/bar" for substr $myvar, 0, 1;

这种语法让我爱上了perl 5.12

for(substr($myvar, 0, 1)) {
    when('.') { $_ = "foo/bar" }
}

答案 3 :(得分:2)

受@ eugene回答讨论的启发,这里有一些在Windows XP上使用ActiveState perl 5.10.1的微基准测试。当然,my benchmarks suck,所以拿一勺盐。

#!/usr/bin/perl

use strict; use warnings;

use Benchmark qw( cmpthese );

my $x = 'x' x 100;
my $y = '.' . $x;

for my $s ($x, $y) {
    printf "%33.33s ...\n\n", $s;
    cmpthese -5, {
        's///' => sub {
            my $z = $s;
            $z =~ s{^\.}{foo/bar};
        },
        'index/substr' => sub {
            my $z = $s;
            if (0 == index $z, '.') {
                substr($z, 0, 1, 'foo/bar');
            }
        },
        'substr/substr' => sub {
            my $z = $s;
            if ('.' eq substr $z, 0, 1) {
                substr($z, 0, 1, 'foo/bar');
            }
        },
    };
    print '=' x 40, "\n";
}

输出:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

                   Rate  index/substr substr/substr          s///
index/substr  1622404/s            --          -14%          -42%
substr/substr 1890621/s           17%            --          -32%
s///          2798715/s           73%           48%            --
========================================

.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

                  Rate          s/// substr/substr  index/substr
s///          367767/s            --          -57%          -62%
substr/substr 857083/s          133%            --          -10%
index/substr  956428/s          160%           12%            --
========================================