5 Stimmen

Wie kann ich in Perl nur das erste Zeichen einer Zeichenkette ersetzen?

Ich kenne mich nicht im Geringsten mit Perl aus und muss einen Fehler in einem Perl-Skript beheben.

Gegeben eine Variable $myvar die eine Zeichenkette enthält, wird das erste Zeichen, wenn es ein Punkt ist, durch "foo/bar" ersetzt.

Wie kann ich das tun?
(Bonuspunkte, wenn Sie den Fehler erraten können)

9voto

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

8voto

Eugene Yarmash Punkte 130008

Sie können verwenden Teilbereich :

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

5voto

gugod Punkte 818

Einige substr Magie:

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

Und diese Syntax lässt mich Perl 5.12 lieben

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

2voto

Sinan Ünür Punkte 114993

Angeregt durch die Diskussion zu @eugenes Antwort, hier einige Micro-Benchmarks mit ActiveState perl 5.10.1 auf Windows XP. Natürlich, meine Benchmarks sind schlecht nehmen Sie es also mit einem Löffel Salz.

#!/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";
}

Ausgabe:

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%            --
========================================

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X