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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> map {$_==$cifra} vs. map {/^$cifra$/}, Что возвращает регулярное выражение 
:(
    Опции темы
amg
Дата 14.9.2006, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вопрос вызван тем, что я так и не смог до конца понять, почему же работает конструкция отсюда:
Код
print "Воооо!!! нашли !!!" if map {/^\Q$cifra\E$/} @massiv;


Посмотрите:
Код

$cifra = 10;
@massiv = qw(4 10 16 20);

@arr = map {$_==$cifra} @massiv; # Пример 1
printf("%4s|", $_) foreach @arr; print "\n";

@arr = map {/^$cifra$/} @massiv; # Пример 2
printf("%4s|", $_) foreach @arr; print "\n";

undef @arr;
push(@arr, /^$cifra$/) foreach @massiv; # Пример 3
printf("%4s|", $_) foreach @arr; print "\n";

По моему глупому разумению, в каждом случае должно было бы печататься одно и то же. 
Однако в примерах 2 и 3 добавление в результирующий массив происходит только когда рег. выражение "срабатывает", т.е. возвращает 1.
Код

    |   1|    |    |
   1|
   1|
 
Если рег. выражение "не срабатывает", оно возвращает "ложь". Я знаю три вида "лжи" в Perl'е: undef, 0, ''. Но если заполнить массив, например, пустыми строками, 
Код

push(@arr, '') foreach @massiv;
то и получится просто массив из 4-х пустых строк (с undef и 0 аналогично).

Вопрос заключается в следующем: какую такую "ложь" возвращает несработавшее регулярное выражение, что map и push не заполняют массив @arr? И можно ли сделать, чтобы $_==$cifra вело себя так же.


Это сообщение отредактировал(а) amg - 14.9.2006, 12:33
PM MAIL   Вверх
amg
Дата 15.9.2006, 05:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Я наконец то разобрался, и отвечаю сам себе. 
Есть еще один вид "лжи" в Perl'е: пустой список. Его то, оказывается, и возвращает "несработавшее" регулярное выражение в контексте map и push. Дальше, учитывая, что список пустых списков есть пустой список, все просто. 
А чтобы $_==$cifra вело себя так же, надо сказать:
Код
@arr = map {$_==$cifra  || ()} @massiv;

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


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

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


 




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


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

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