Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Использовать хэш или масссив?


Автор: meridian 29.11.2009, 17:08
Привет всем!
Есть вычисляемая переменная $a
В зависимости от ее значения, а именно вхождения в границы  [0..5], [6..10], [11..15] и т.д., нужно присвоить значение $a другой переменной, ассоциированной для каждого периода, 
например, 
если  $a = 4, то присваем это значение $c0_5
если  $a = 13, то присваем это значение $c11_15 и т.д.

С помощью if че то длинно получается.

Спасибо.

Автор: admsasha 29.11.2009, 18:02
1. На мой взляд, разумнее было бы использовать хеш

Цитата(meridian @  30.11.2009,  00:08 Найти цитируемый пост)
В зависимости от ее значения, а именно вхождения в границы  [0..5], [6..10], [11..15] 

как строятся вхождения ? В первой границе 6 чисел, во второй 5 чисел... 

Автор: meridian 29.11.2009, 18:12
Цитата(admsasha @ 29.11.2009,  17:02)
1. На мой взляд, разумнее было бы использовать хеш

Цитата(meridian @  30.11.2009,  00:08 Найти цитируемый пост)
В зависимости от ее значения, а именно вхождения в границы  [0..5], [6..10], [11..15] 

как строятся вхождения ? В первой границе 6 чисел, во второй 5 чисел...

Все верно, как указаны , так и идут [0..5], [6..10], [11..15], далее по пять до 30-ти 

Автор: admsasha 29.11.2009, 18:34
Цитата(meridian @  30.11.2009,  01:12 Найти цитируемый пост)
Все верно, как указаны , так и идут [0..5], [6..10], [11..15], далее по пять до 30-ти  


типа, вот так тогда...  правда, не самый лучший вариант...

Код

#!/usr/bin/perl

use strict;

my $a=13;

my $n1=int(($a-1)/5);
$n1=($n1*5)+1;

my $n2 = $n1+4;
$n1=0 if ($n1<5);

print "c".$n1."_".$n2."\n";


Автор: meridian 29.11.2009, 23:20
Понятно, спасиб!
Еще вопрос
Как узнать, принадлежит ли значение переменной $diff к какому-либо из этих вхождений [0..5], [6..10], [11..15], и т.д. 
Можно сделать с if или SWITCH:

А покороче есть варианты ?

Автор: arto 30.11.2009, 01:06
perl -E 'given ($ARGV[0]) { when ([0..5]) { say "one"; } when ([6..10]) { say "two"; } }'

Автор: meridian 30.11.2009, 01:56
Цитата(arto @ 30.11.2009,  00:06)
perl -E 'given ($ARGV[0]) { when ([0..5]) { say "one"; } when ([6..10]) { say "two"; } }'

Понял, спб. Given есть аналог SWITCH, почти все так же.

Автор: admsasha 30.11.2009, 03:05
Цитата(meridian @  30.11.2009,  06:20 Найти цитируемый пост)
Как узнать, принадлежит ли значение переменной $diff к какому-либо из этих вхождений [0..5], [6..10], [11..15], и т.д. 
Можно сделать с if или SWITCH:

А покороче есть варианты ?


Из условия, 
Код

if ($diff<=30){
// принадлежит
}else{
// не принадлежит
}


 smile 

Автор: meridian 30.11.2009, 12:11
Цитата(admsasha @ 30.11.2009,  02:05)
Цитата(meridian @  30.11.2009,  06:20 Найти цитируемый пост)
Как узнать, принадлежит ли значение переменной $diff к какому-либо из этих вхождений [0..5], [6..10], [11..15], и т.д. 
Можно сделать с if или SWITCH:

А покороче есть варианты ?


Из условия, 
Код

if ($diff<=30){
// принадлежит
}else{
// не принадлежит
}


 smile

Саша, я ж и написал,  "А покороче есть варианты?". Твой вариант был первый, что можно сделать по быстрому  smile 

Автор: Bulat 30.11.2009, 13:20
meridian, 

а если сделать массив(т.е. заранее объявить всевозможные подмножества одного множества от 0 до 30), где

[0..5], [6..10], [11..15] - индексы массива, а значения индексов будут одинаковы для каждого из отрезков.

Т.е.

Код

my @array;

$array[0] = "part 1";
...
$array[5] = "part 1";
$array[6] = "part 2";
...
$array[10] = "part 2";


$array[$a] - смотрим что возвращает, собственно аналог варианта с хэшем smile

для более короткого присвоения значений массива можно использовать цикл

Код

while (my $i = 0; $<= 30; $i++) {
  @array = "part 1" if $i/5 <= 1 || $i == 0;
  ..
}


собственно для еще большего упрощения можно отдельно обработать случай с нолем, а для остальных делить и на 5 и округлять до целого (POSIX::ceil - вернет округленное значение в большую степень, т.е. для  от 0,0...1 до 1 вернет 1, от 1,0...1 до 2 вернет 2 и т.д.)  - это целое и будет индексом подмножества, т.е. part <index>

таким образом можно обработать дальше 30... хоть до 3 000 000  smile 

Автор: krypt3r 30.11.2009, 15:43
Код

$a = $a >= 0 && $a < 6 ? 111 : $a;
$a = $a >= 6 && $a < 11 ? 222 : $a;
$a = $a >= 11 && $a < 15 ? 333 : $a;

smile

Автор: meridian 30.11.2009, 16:07
Масса вариантов, гуд.
Спасибо всем! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)