Разделить регулярное выражение, вернуть только символы, цифры и подчеркивания. Perl - PullRequest
0 голосов
/ 12 ноября 2018

Попытка разбить линию

#!/usr/bin/perl -w

со следующим кодом

use strict;
use warnings;

my %words;

while (my $line = <>)
{
foreach my $word (split /:|,\s*|\/|!|\#|-/, $line)
{
    $words{$word}++;
}
}

foreach my $word (keys %words)
{
print "$word: $words{$word}\n";
}

Есть ли более простой способ разделить команду split только на слова, цифры и подчеркивания? Вместо того, чтобы устанавливать все эти разделители.

Попытка получить вывод

usr: 1
bin: 1
perl: 1

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вы также можете сделать это с помощью 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 +.

0 голосов
/ 12 ноября 2018

Не делить, извлечь.

++$words{$_} for $line =~ /\w+/g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...