У вас есть основная часть ответа от Натана;остаточное наблюдение состоит в том, что большинство людей не считают знаки препинания и цифры буквами, а ваша подпрограмма это делает.Я бы, наверное, пошел с:
sub countLetters
{
my($sentence) = @_;
$sentence =~ s/[^[:alpha:]]//gm;
return length($sentence);
}
Ключевым моментом здесь являются круглые скобки вокруг списка переменных в предложении my
.Как правило, в подпрограмму передается несколько аргументов, и вы можете назначать (копировать) их переменным в вашей подпрограмме следующим образом:
my($var1, $var2, $var3) = @_;
Скобки обеспечивают «контекст списка» и гарантируют, что первыйэлемент @_
копируется в $var1
, второй в $var2
и так далее.Без скобок у вас есть «скалярный контекст», а когда массив оценивается в скалярном контексте, возвращаемое значение является количеством элементов в массиве.Таким образом:
my $var1, $var2, $var3 = @_;
, скорее всего, назначит 3 для $var1
(поскольку три подпрограммы были переданы в подпрограмму), а $var1
и $var2
оба будут undef
.
Регулярное выражение удаляет все не алфавитные символы из строки;количество букв - это длина того, что осталось.