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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив и условие 
:(
    Опции темы
AlexanderI
Дата 20.7.2006, 10:34 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Помогите создать условие.

У меня есть массив:
@massiv = qw(4 10 16 20);
Каким образом создать условие так, чтобы проверялось сразу принадлежность каждого значения массива ?

т.е например:

Код

if ($cifra равно (4 или 10 или 16 или 20) ){
# чёт выполняется
}
  

Это сообщение отредактировал(а) AlexanderI - 20.7.2006, 10:35
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
Nab
Дата 20.7.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



неее, пользуйся лучше хешем... 

или вот так  smile 
Код

@massiv = qw(4 10 16 20);
@{%mass}{@massiv} =1 x @massiv;
print 'OK' if exists $mass{$cifra};
 

Тут вкралась ошибочка, смотрите топик ниже

Правильно вот так:
Код

@massiv = qw(4 10 16 20);
@{%mass}{@massiv} = (1) x @massiv;
print 'OK' if exists $mass{$cifra};
 
Хотя в данном конкретном случае это никак не влияет, мы проверяем существование ключа а не его истиннось, но ради принципа всеже этот вариант вернее...

Это сообщение отредактировал(а) Nab - 17.8.2006, 12:56


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Throne
Дата 20.7.2006, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В крайнем случае можно изобразить что-то типа
Код

if ($cifra eq 4 || $cifra eq 6 || $cifra eq 8) {
print "$cifra\n";
};
  

Это сообщение отредактировал(а) Throne - 20.7.2006, 15:45
--------------------
Компьютер — это наредкость тупая вещь, но считает с феноменальной скоростью. 
PM MAIL   Вверх
DiverD
Дата 20.7.2006, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



еще как вариант с форейчем:
Код


@massiv = qw(4 10 16 20);
foreach(@massiv) 
{
    $_ == 1 ? print "[ok]\n" : print "[no]\n";
}

--------------------
[ FreeBSD & pERL p0WER eVERY dAY ]
PM MAIL   Вверх
Ramirez
Дата 21.7.2006, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 18.1.2005
Где: Moscow, ExUSSR

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



вот еще вариантец

Код

print '[ok]' if defined $massiv[$cifra]
  

Это сообщение отредактировал(а) Ramirez - 21.7.2006, 10:19
PM ICQ   Вверх
lanD
Дата 21.7.2006, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Почитай про логические операторы 
PM MAIL   Вверх
igorold
Дата 21.7.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

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



Цитата(Ramirez @  21.7.2006,  10:18 Найти цитируемый пост)
if defined $massiv[$cifra]

это из другой оперы - это ты проверяешь определен ли энный элемент массива, где эн=$cifra
 


--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
sharq
Дата 21.7.2006, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



AlexanderI, 

Код

if (grep {$cifra == $_} @massiv) { # здесь grep используется в скалярном контексте
  ...
}


 smile 
 


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Nab
Дата 21.7.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

print "OK" if map {/$cifra/} @massiv; # Играем в ПерлГольф? 

;)
 


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
sharq
Дата 28.7.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



Nab, т.е. в твоем варианте прокатит:

$cifra = 4, а какой-нить элемент массива @massiv 345 или 4me smile 

 smile  


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Nab
Дата 28.7.2006, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну вот началось  smile 
я так и знал что начнеться smile 
блин и в праздник обижают  smile 

все знают как помочь беде  smile 

ну ладно, так и быть скажу  smile  ....


Код

print "Воооо!!! нашли !!!" if map {/^\Q$cifra\E$/} @massiv; 

или
Код

print "Ooops!! found again :)" if map { $cifra == $_ } @massiv; 
 


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Danissimo
Дата 14.8.2006, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Nab @ 20.7.2006,  15:23)
Код

@massiv = qw(4 10 16 20);
@{%mass}{@massiv} =1 x @massiv;
print 'OK' if exists $mass{$cifra};

2 Nab:
Переведи, плз, 2-ю строчку
PM MAIL   Вверх
Nab
Дата 15.8.2006, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Danissimo @ 14.8.2006,  17:14)
Цитата(Nab @ 20.7.2006,  15:23)
Код

@massiv = qw(4 10 16 20);
@{%mass}{@massiv} =1 x @massiv;
print 'OK' if exists $mass{$cifra};

2 Nab:
Переведи, плз, 2-ю строчку

Ууу, ее сложно в двух словах объяснить, но я попытаюсь smile

В левой части выражения мы формируем срез хеша предсталенный в виде массива. И каждому элементу которого в правой части присваиваем 1.

Срез хеша это приблизительно вот так:

Код

#есть 
my %mass = ()

#чтобы добыть сразу несколько значений, делаем так
@mass = ($mass{'one'}, $mass{'two'}, $mass{'three'});

#чтобы не писать каждое значение отдельно сразу представим их как массив
@mass = @{%mass}{'one','two','three'};

#то есть, хеш берем как массив значений, по списку ключей
#ну а так как у нас есть список 
@massiv = ('one','two','three');
#то пишем еще короче
@mass = @{%mass}{@massiv};


Так как нас интересует присваивание то этот срез хеша попадает в левую часть. В правую попадает вот такое выражение:
Код

(1) x @massiv;



оператор x - это повторитель, он повторяет элемент (число, строку) указанный как левый операнд... правый операнд определяет количество этих самых элементов.
В нашем случае, это массив, который в  скалярном контексте  возвращает количество своих элементов.

Вообще это один из самых простых способов заполнить хеш или массив повторяющимся или дефолтным значением.

Я не скажу что это очень сложно, но осваивается с трудом smile.

Этот способ хорошо применим когда нужно перевернуть хеш, то есть поменять местами ключи и значения...

Код

@{%mass}{values %mass} = keys %mass;


Конечно при одинаковых значениях элемент может потеряться, но какой именно, эт боюсь не скажу smile и за этим вам самим прийдется следить  smile 

Ну вот вроде и все, надеюсь понятно объяснил  smile 
Если что спрашивайте...

Это сообщение отредактировал(а) Nab - 9.9.2006, 01:04


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Danissimo
Дата 16.8.2006, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Супер!!!

1. Правильно я понимаю, что
Код

@{%hash}{@mass} = ...;
# это то же самое, что и
(%hash{@mass}) = ...


2. Про 1 x @mass я так и думал. Тока не понятно, зачем? Почему просто не сказать @{%hash}{@mass} = 1;?

3. Где написано, что в конструкции @{%hash}{@mass} сначала выполняется %hash{@mass}, а затем уже результат преобразовывается к массиву (или списку)?

4. Наскока я мог понять из прочтенного, список и массив -- разные вещи. (1, 2, 3) -- список, @x = (1, 2, 3) -- массив, в который скопированы элементы списка. Это верно?

5. Меня удручает, что не могу найти четких правил о семантике языка. Например, где однозначно говорится, в чем отличия в интерпретации @%hash{@mass} и @{%hash}{@mass}. Где?

Если не сложно, конечно =)
PM MAIL   Вверх
Nab
Дата 16.8.2006, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так, сразу приношу извинения кого ввел в заблуждение:

Конструкция '1 x 10' создаст строку из десяти единичек. В нашем же случае нужны отдельные элементы, посему их нужно екранировать...  
Вот верный код:
Код

(1) x 10;



Цитата(Danissimo @  16.8.2006,  12:06 Найти цитируемый пост)
1. Правильно я понимаю, что
Код

@{%hash}{@mass} = ...;    
# это то же самое, что и    
(%hash{@mass}) = ...

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


Цитата(Danissimo @  16.8.2006,  12:06 Найти цитируемый пост)
2. Про 1 x @mass я так и думал. Тока не понятно, зачем? Почему просто не сказать @{%hash}{@mass} = 1;?

Аналогично предыдущему... Сначала самому проверить, а потом писать. С учетом того что я тоже ошибся smile


Цитата(Danissimo @  16.8.2006,  12:06 Найти цитируемый пост)
3. Где написано, что в конструкции @{%hash}{@mass} сначала выполняется %hash{@mass}, а затем уже результат преобразовывается к массиву (или списку)?

С чего ты это взял? Эта конструкция вообще не верна.


Цитата(Danissimo @  16.8.2006,  12:06 Найти цитируемый пост)
4. Наскока я мог понять из прочтенного, список и массив -- разные вещи. (1, 2, 3) -- список, @x = (1, 2, 3) -- массив, в который скопированы элементы списка. Это верно?

Нет  smile  Список и массив одно и тоже...


Цитата(Danissimo @  16.8.2006,  12:06 Найти цитируемый пост)
5. Меня удручает, что не могу найти четких правил о семантике языка. Например, где однозначно говорится, в чем отличия в интерпретации @%hash{@mass} и @{%hash}{@mass}. Где?

Аналогично первому, сначала проверить на жизнеспособность а потом писать...

Семантика перла многовариантна, это фича  smile языка, что любое действие можно сделать более чем одним способом smile

Купи LamaBook И очень рекомендую Perl CookBook... Как раз в ней это все есть....


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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