我不知道一点点Perl并且必须修复Perl脚本中的错误。
给定包含字符串的变量$myvar
,如果第一个字符是点,则将其替换为“foo / bar”。
我该怎么做?
(如果你能猜到这个bug,可以获得奖励积分)
答案 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% -- ========================================