В Perl есть функция ucfirst.
Это эквивалентно этому:
Давайте выясним ...
$ cat testuc
use strict;
use warnings;
use Test::More;
sub uppercase {
my ($w) = @_;
return uc(substr($w, 0, 1)) . substr($w, 1);
}
my @tests = qw[foobar Foobar FOOBar fOObar fOObAR FOOBAR];
for (@tests) {
is(ucfirst($_), uppercase($_), "correct for $_");
}
done_testing;
$ prove -v testuc
testuc ..
ok 1 - correct for foobar
ok 2 - correct for Foobar
ok 3 - correct for FOOBar
ok 4 - correct for fOObar
ok 5 - correct for fOObAR
ok 6 - correct for FOOBAR
1..6
ok
All tests successful.
Files=1, Tests=6, 0 wallclock secs ( 0.04 usr 0.03 sys + 0.03 cusr 0.04 csys = 0.14 CPU)
Result: PASS
Итак, да, похоже, это одно и то же (по крайней мере, для моего довольно ограниченного набора тестов).
Я использую Perl 5.26.1 - но я думаю, что это будет хорошо работать длявсе версии Perl вернутся как минимум до 5.10.
Обновление:
Я сделал тихое редактирование вашего кода, которое я забыл упомянуть.Ваш код изначально работал со ссылкой на скаляр, но я изменил его для работы со скаляром ($W
вместо $$W
).Я предполагал, что это будет безвредной заменой.
Но теперь вы показали нам ваше изменение в контексте , и я могу видеть, что происходит.
У вас было:
&uppercase(\$WORD[$i])
И вы изменили это на:
ucfirst(\$WORD[$i])
Это не работает, так как ucfirst()
не меняет свой аргумент;возвращает измененное значение.Таким образом, вы на самом деле хотите:
$WORD[$i] = ucfirst($WORD[$i]);
Это будет работать тогда, как и ожидалось (по модулю проблем с символами Unicode, упомянутыми в других ответах.
Весь ваш цикл может быть упрощен, если вы отойдете от Cстиль for
петля.
for my $w (@WORD) {
$w = ucfirst($w) if $sentence_start;
if (defined $SENTENCE_END{ $w }) {
$sentence_start = 1;
} elsif (!defined $DELAYED_SENTENCE_START{ $w }) {
$sentence_start = 0;
}
}