Вы также можете сделать это с помощью split и отрицательного слова класс символов :
foreach my $word (split /\W+/, $line) {
$words{$word}++;
}
Но учтите, что поскольку ваша строка начинается с несловарных символов, первое слово, которое она вернет, будет пустой строкой в начале строки.
Другим инструментом для этой задачи (но больше подходящим для прозы, чем для кода и имен файлов) является граница слова в Юникоде , которая использует правила Юникода для определения начала и конца слов и учитывает такие вещи, как апострофы. часть слов (can't
). Чтобы использовать это, вам сначала нужно разделить входные данные в список, содержащий как слова, так и не слова, а затем найти слова (самый простой способ, вероятно, использовать любые элементы, которые содержат хотя бы один символ слова):
foreach my $word (grep { m/\w/ } split /\b{wb}/, $line) {
$words{$word}++;
}
Для регулярного выражения \b{wb}
требуется Perl 5.24 +.