В исследовании этого вопроса я заглянул в главу Iterators в книге «Более высокий порядок Perl», а некоторые из материалов были немного над моей головой и не думали, что обязательно будут обращать внимание на то, что я специально хочу здесь ,Создание ленивого хэшированного итератора
Что я имею в виду ленивого хэшированном итератор способ создать структуру, которая будет эмулировать такое поведение:
%Ds = {
'1' => 1 .. 20;
'2' => 21 .. 40;
'3' => 41 .. 60;
'4' => 61 .. 80;
...
}
К сожалению, так как это хэш это не было бы в порядке, и, таким образом, бесполезно в случае очень большие числа.
Поведение заключается в следующем:
I have a number.
I need to compare it with a sequence of ranges and as a result of the comparison the
code/sub would return another number that is the "key" of that range in case the
number is in that range. (>= with the beginning or <= with the end point of said range)
The "key" of the ranges are numbers from 1..2..3 and so on.
The code/sub will always return for a positive integer no matter how large it is.
Осуществляя все это лениво я имею в виду, если есть способ, чтобы эмулировать это поведение, а не вычислять последовательности диапазонов с их соответствующими «ключей» при каждом вызове из суб или итерации цикла. В основном вычислить один раз.
Да, это правда, что я мог выбрать максимальную границу, жестко кодировать ее в цикле и делать с ней, но проблема в том, что я не знаю, сколько из этих шагов мне понадобится в конце.
Есть ли способ сделать это с помощью perl-конструкций или, возможно, есть модуль CPAN, который предлагает такое поведение, и мой простой поиск не выявил его.
Вот фрагмент кода, который иллюстрирует то, что я имею в виду:
sub get_nr {
my $nr = shift;
my %ds = map { $a = '1' if /1/ .. /20/;
$a = '2' if /21/ .. /40/;
$a = '3' if /41/ .. /60/;
$a = '4' if /61/ .. /80/;
$_ => $a } 1 .. 80;
while (my ($k, $v) = each %ds) {
if ($k == $nr){
print "number is in range $v \n";
}
}
}
Выход для:
get_nr(4);
get_nr(15);
get_nr(22);
get_nr(45);
ли:
number is in range 1
number is in range 1
number is in range 2
number is in range 3
Мне сложно понять ваш вопрос, потому что вы продолжаете думать о желании поведения, но вы не описываете никаких поведений. (Кажется, вы описали структуру данных.) Правильно ли вам сказать, что вы хотите функцию, называемую '$ h {$ x}', которая возвращает '$ x * 20-19 .. $ x * 20'? – ikegami
'Ds' - это не Perl-переменная, это гобе. Вы имели в виду '$ Ds'? – TLP
Кроме того, это типичный вопрос, который звучит как XY-проблема: задавать вопрос о решении вместо проблемы, которую вы пытаетесь решить. Было бы полезно узнать, какую проблему вы пытаетесь решить, используя эту технику. – TLP