代码之家  ›  专栏  ›  技术社区  ›  Cephalopod

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

  •  5
  • Cephalopod  · 技术社区  · 15 年前

    我对Perl一无所知,必须在Perl脚本中修复一个bug。

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

    我该怎么做?
    (如果你能猜到这个bug,就可以得到加分)

    4 回复  |  直到 15 年前
        1
  •  9
  •   Benoit    15 年前
    $myvar =~ s+^\.+foo/bar+ ;
    
        2
  •  8
  •   Sinan Ünür    15 年前

    你可以使用 substr :

     substr($myvar, 0, 1, "foo/bar") if "." eq substr($myvar, 0, 1);
    
        3
  •  5
  •   gugod    15 年前

    一些 substr 魔术:

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

    这个语法让我爱上了Perl5.12

    for(substr($myvar, 0, 1)) {
        when('.') { $_ = "foo/bar" }
    }
    
        4
  •  2
  •   Sinan Ünür    15 年前

    受@eugene答案讨论的启发,以下是一些在WindowsXP上使用ActiveStatePerl5.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%            --
    ========================================