Существует ли ярлык Perl для подсчета количества соответствий в строке?

Отправка для FTP - каков веб-сайт Копии должен был быть.

Это просто вышло, но мне нравится он много: Файловый менеджер Mindscape

VisualSVN превосходен для интеграции SVN. Намного лучше, чем Анк (не попробовали Анк 2 + хотя)

SonicFileFinder для поиска файлов или классов быстро. Поддержки, ищущие просто прописные части имени типа в корпусе верблюдом

веб-Проекты Развертывания Microsoft для предварительной компиляции проектов веб-сайта

75
задан Relequestual 4 November 2016 в 11:48
поделиться

6 ответов

Это помещает само регулярное выражение в скалярный контекст, а это не то, что вам нужно. Вместо этого поместите регулярное выражение в контекст списка (чтобы получить количество совпадений) и поместите , что в скалярный контекст.

 my $number = () = $string =~ /\./gi;
112
ответ дан 24 November 2019 в 11:33
поделиться

Я думаю, что самый ясный способ описать это - избежать мгновенного преобразования в скаляр. Сначала назначьте массив, а затем используйте этот массив в скалярном контексте. По сути, это то, что будет делать идиома = () = , но без (редко используемой) идиомы:

my $string = "one.two.three.four";
my @count = $string =~ /\./g;
print scalar @count;
32
ответ дан 24 November 2019 в 11:33
поделиться

Также см. Perlfaq4 :

Есть несколько способов с различной эффективностью. $ count = ($ string = ~ tr / X //); print "В строке $ count X символов";

Это нормально, если вы просто ищете одного персонажа. Однако, если вы пытаетесь подсчитать несколько символьных подстрок в более крупной строке, tr /// работать не будет. Что вы можете сделать, так это обернуть цикл while () вокруг совпадения глобального шаблона. Например, посчитаем отрицательные целые числа:

 $ string = "-9 55 48 -2 23 -76 4 14 -44";
while ($ string = ~ / - \ d + / g) {$ count ++}
print "В строке $ count отрицательных чисел";

Другая версия использует глобальное совпадение в контексте списка, затем присваивает результат скаляру, производя подсчет количества совпадений.

 $ count = () = $ string = ~ / - \ d + / g;
20
ответ дан 24 November 2019 в 11:33
поделиться

Попробуйте следующее:


my $string = "one.two.three.four";
my ($number) = scalar( @{[ $string=~/\./gi ]} );

Он вернет 3 для мне. При создании ссылки на массив регулярное выражение оценивается в контексте списка, и @ {..} отменяет ссылку на ссылку на массив.

6
ответ дан 24 November 2019 в 11:33
поделиться

Является ли следующий код однострочным?

print $string =~ s/\./\./g;
7
ответ дан 24 November 2019 в 11:33
поделиться

другой способ,

my $string = "one.two.three.four";
@s = split /\./,$string;
print scalar @s - 1;
-1
ответ дан 24 November 2019 в 11:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: