powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) Поиск слов в которых четное количество гласных букв
7 сообщений из 7, страница 1 из 1
(Perl) Поиск слов в которых четное количество гласных букв
    #33714569
oraweb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно решить задачу, (см. $text) более элегантно, если это возможно, нежели способом указанном ниже.
Можно ли ее решить за "один присест" без циклов.
Своих извилин хватило только на это:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
my $var1;
my $var2;
my $text = "Поиск слов в которых четное количество гласных букв";
while ($text =~ m/(\w+)\s?/g) {                    # вычленяем слова по отдельности
        $var2 = $ 1 ;
        $var1 = $ 1 ;
        $var1 =~ s/([^иеаоюэяуыё])//gi;            # удаляем не гласные буквы
        $var1 = length($var1);                     # подсчитываем количество гласных букв
        if (($var1 %  2 ) ==  0  and $var1>= 1 ) {       # проверка на четность гласных
        print $var2."\n";                          # вывод слов в которых четное количество гласных букв
        }
}


На выходе имеем:
Поиск
количество
гласных
...
Рейтинг: 0 / 0
(Perl) Поиск слов в которых четное количество гласных букв
    #33716998
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#!/usr/bin/perl

use strict;
use warnings;
use locale;

my $text = "Поиск слов в которых четное количество гласных букв";

my $lett    = "уеыаоэяиюё";
my $delim   = "\\s";
my $patt_ok = "[${lett}]";
my $patt_no = "[^${delim}${lett}]";
my $word_ok = "${patt_no}*(?:(?:${patt_ok}${patt_no}*){2})*";
my $word_no = "${patt_no}*${patt_ok}${patt_no}*(?:(?:${patt_ok}${patt_no}*){2})*";

$text =~ s/(^|${delim})(${word_ok})(?=${delim}|$)/$ 1 +>$ 2 /g;

$text =~ s/(^|${delim})(${word_no})(?=${delim}|$)/$ 1 ->$ 2 /g;

print "$text\n";
...
Рейтинг: 0 / 0
(Perl) Поиск слов в которых четное количество гласных букв
    #33718494
Shoore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
$vowels = 'у|е|ы|а|о|э|я|и|ю|ё';
$text = 'Поиск слов в которых четное количество гласных букв';

@words = grep { @t = /$vowels/gi; @t*1 ^ 1 } split(/\s+/,$text);
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
(Perl) Поиск слов в которых четное количество гласных букв
    #39473589
Сергей314
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот моё решение через одно re.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#!/usr/bin/perl -w
use strict;
use re 'eval';

# Вывод всех русских слов в $_ в кодировке Windows, в которых чётное число гласных букв
# Сделано www.cronc.com/ru/

my $rebukva=qr/[А-Яа-яЁё]/;
my $renebukva=q/[^А-Яа-яЁё]/;
my $reglasbukva=qr/[АЕЁИОУЫЭЮЯаеёиоуыэюя]/;
my $rebegword=qr/(?<!$rebukva)(?=$rebukva)/;
my $reendword=qr/(?<=$rebukva)(?!$rebukva)/;
my $reword=qr/($rebegword(?{$^R=1})                    # начало слова, устанавливаем $^R=1 (чёт)
               (?:$reglasbukva(?{$^R^=1})|$rebukva)++  # в слове после каждой гласной делаем $^R^=1
               $reendword)(?{print "$^N\n" if $^R})    # в конце слова выводим его, если $^R == 1
             /x;
my $retext=qr/$renebukva*+(?:$reword$renebukva++)++/;

$_='Поиск слов в которых четное количество гласных букв';
/$retext/;


У автора вопроса не выводятся слова с 0-м числом гласных, а предыдущее решение выглядит круто и загадочно, но иногда выводит слова с нечётным количеством гласных...

Также надо учесть, что слово в русском языке это не \w+, т.к. цифр, латинских букв и подчёрков в нём нет...
...
Рейтинг: 0 / 0
(Perl) Поиск слов в которых четное количество гласных букв
    #39473749
Сергей314
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл о словах с дефисом. Нетрудно задать дефис, как особую букву, по бокам которой стоят настоящие буквы, и опять по кирпичикам собрать re для слова, как я делал.
...
Рейтинг: 0 / 0
(Perl) Поиск слов в которых четное количество гласных букв
    #39473756
Сергей314
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для больших текстов Perl выдаёт сообщение "Complex regular subexpression recursion limit (32766) exceeded at ..."
...
Рейтинг: 0 / 0
(Perl) Поиск слов в которых четное количество гласных букв
    #39473789
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Язык : Perl6
Версия : Rakudo version 2017.04.3 built on MoarVM


Файл : Чётное-число-гласных-в-слове
Кодировка : UTF-8
Код: perl
1.
2.
3.
#!/usr/bin/env perl6 -n

.say if m:i:g /<[АЕЁИОУЫЭЮЯ]>/ and not @()%2 for .words



Среда : Linux; zsh
locale : LC_CTYPE="UTF-8"
Код: coco
1.
2.
3.
chmod +x Чётное-число-гласных-в-слове

./Чётное-число-гласных-в-слове <<<"как говорил нам Ефрейтор Пердыщенко: еб рефрфх  иойсдуисх  р ейрце це фхейц ехц эбу"



Вывод :
Пердыщенко:
иойсдуисх
ейрце
эбу



Пояснения : главная фича - в Перл6 новый синтаксис регулярных выражений.

Вызов perl6 с ключом -n заставляет программу читать построчно из стандартного устройства ввода.

Выражение m:i:g /<[АЕЁИОУЫЭЮЯ]>/ сравнивает строку с шаблоном, используя механизм рег. выражений.
<[АЕЁИОУЫЭЮЯ]> - символьный класс ( а просто квадратные скобки [] - это незахватывающая группировка )

:i :g - модификаторы ( i gnore case, g lobal ), то есть, в отличие от Perl5 модификаторы указываются перед шаблоном
m - оператор m atch

.words - вызов метода words() у скаляра $_ ( то есть, $_ можно не писать )

.say - вызов метода say() у скаляра $_

@() - это синтаксический сахар для выражения @( $/ ), где $/ - это скаляр, содержащий Match-objec t,
a @ перед скобками () заставляет $/ вернуть все совпадения одним плоским списком;

%2 - остаток от деления на 2 - заставит этот список в скалярном контексте вернуть число членов.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) Поиск слов в которых четное количество гласных букв
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]