LINUX.ORG.RU

проверить вхождение числа в диапазон на perl

 


0

2

Всем доброго утра!

Есть такой код:

function plural(n: integer; f1,f2,f3: string): string;
begin
    case n mod 100 of   { последние две цифры или одна, если число однозначное }
        1, 21, 31, 41, 51, 61, 71, 81, 91       : plural := f1; { день }

        2..4, 22..24, 32..34, 42..44,
        52..54, 62..64, 72..74, 82..84, 92..94  : plural := f2; { дня  }

        0, 5..9, 10..20, 25..30,
        35..40, 45..50, 55..60, 65..70,
        75..80, 85..90, 95, 96, 97, 98, 99      : plural := f3; { дней }
    end
end;

var i : integer;
begin
    for i := 0 to 260 do writeln(i, ' ', plural(i,'день','дня','дней'));
    for i := 0 to 180 do writeln(i, ' ', plural(i,'копейка','копейки','копеек'));
end.

Как в perl'e проверить вхождение строки в диапазон? Регулярные выражения имхо - накладно. grep'aть массив (x..y) тоже. Использовать для такой простой задачи сторонние модули - перебор. Что посоветуете?

Deleted

Остатком пользоваться не учили? Все числа mod 10, кроме 11-19, склоняются одинаково.

х11-х19 дней, х1 день, х2-х4 дня, х5-х0 дней.

arturpub ★★
()
Последнее исправление: arturpub (всего исправлений: 1)
Ответ на: комментарий от arturpub

х11-х19 дней, х1 день, х2-х4 дня, х5-х0 дней.

Угу. Только я дурак, и мне это ни о чём не говорит. Какой примерно код?

Deleted
()
Ответ на: комментарий от Deleted

m#1[1-9]$#?«$_ дней»:m#1$#?«$_ день»:m#[2-4]$#?«$_ дня»:«$_ дней»

arto ★★
()
use 5.10.0;

my $integer   = 42;
my $array_ref = [0 .. 0, 1 .. 1, 2 .. 10];

say 'in range' if $integer ~~ $array_ref;
outtaspace ★★★
()

Регулярные выражения имхо - накладно. grep'aть массив (x..y) тоже.

Все познается в бенчмарке. В интенсивных циклах лучше оптимизировать, да.

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

Значит не настолько критично в плане оптимизаций. Если критично, то поможет List::MoreUtils::first_index, у него XS-версия есть.

outtaspace ★★★
()

Я 3 раза прочитал код, но так и не понял что за ЯП. Потом взяглянул на теги и у меня отпала челюсть.... Это первая для меня программа на perl которую можно прочитать

comp00 ★★★★
()
Ответ на: комментарий от comp00

Вроде как у ОП код не на перле, а ему нужно на перле, так что все впорядке, тебя просто ввели в заблуждение :)

goingUp ★★★★★
()
Ответ на: комментарий от gh0stwizard

Чой-то? Остаток это не только %, /.$/ вполне канает :)

Ну или еще можно

{
    my @m = split //, "31222" . ("3" x 15) . ("3122233333" x 8);
    sub pl($$$$) { $_[$m[$_[0] % 100]] }
}

arturpub ★★
()
Ответ на: комментарий от goingUp

Новички же.. Код нужно не читать, а писать!!1 За читать деньги не платят!

arturpub ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.