Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использовать хэш или масссив? 
V
    Опции темы
meridian
Дата 29.11.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



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

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

Спасибо.
PM   Вверх
admsasha
Дата 29.11.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



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

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

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

PM MAIL WWW ICQ Jabber   Вверх
meridian
Дата 29.11.2009, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



Цитата(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-ти 
PM   Вверх
admsasha
Дата 29.11.2009, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Цитата(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";


PM MAIL WWW ICQ Jabber   Вверх
meridian
Дата 29.11.2009, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



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

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


Это сообщение отредактировал(а) meridian - 29.11.2009, 23:20
PM   Вверх
arto
Дата 30.11.2009, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perl -E 'given ($ARGV[0]) { when ([0..5]) { say "one"; } when ([6..10]) { say "two"; } }'
PM MAIL ICQ   Вверх
meridian
Дата 30.11.2009, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) meridian - 30.11.2009, 01:57
PM   Вверх
admsasha
Дата 30.11.2009, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



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

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


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

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


 smile 
PM MAIL WWW ICQ Jabber   Вверх
meridian
Дата 30.11.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



Цитата(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 
PM   Вверх
Bulat
Дата 30.11.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



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 

Это сообщение отредактировал(а) Bulat - 30.11.2009, 13:22


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
krypt3r
Дата 30.11.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 2
Всего: 16



Код

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

smile
PM MAIL   Вверх
meridian
Дата 30.11.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



Масса вариантов, гуд.
Спасибо всем! 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.