В Perl, как я могу заменить только первый символ строки? - PullRequest
5 голосов
/ 06 октября 2010

Я не знаю ни малейшего кусочка Perl и должен исправить ошибку в скрипте Perl.

Учитывая переменную $myvar, которая содержит строку, если первый символ - точка, замените ее на "foo / bar".

Как я могу это сделать?
(Бонусные баллы, если вы можете угадать ошибку)

Ответы [ 4 ]

9 голосов
/ 06 октября 2010
$myvar =~ s+^\.+foo/bar+ ;
8 голосов
/ 06 октября 2010

Вы можете использовать substr :

 substr($myvar, 0, 1, "foo/bar") if "." eq substr($myvar, 0, 1);
5 голосов
/ 06 октября 2010

Некоторые substr магия:

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

И этот синтаксис заставляет меня любить perl 5.12

for(substr($myvar, 0, 1)) {
    when('.') { $_ = "foo/bar" }
}
2 голосов
/ 06 октября 2010

Вдохновленные обсуждением ответа @ eugene, вот несколько микро-тестов, использующих ActiveState perl 5.10.1 в Windows XP.Конечно, мои тесты отстой , поэтому возьмите его с ложкой соли.

#!/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%            --
========================================
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...