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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удалить элемент массива не могу 
:(
    Опции темы
johndes
  Дата 18.5.2007, 04:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть цикл перебора значений массива и проверки на валидность.... 
Подскажите как удалить элемент массива если он не прошол проверку...
Пробовал splice, но она в цикле foreach почемуто удаляем только следующий элемент после текущего


Код

foreach (@adr){
        my @adress=split(/##/,$_,7);
        if ($adress[0] !~ /^\d+$/) {$error .= 'Не правильный адрес<br>';}
        if ($adress[1] !~ /^\d{11}00$/) {$error .= 'Не правильный населённый пункт<br>';}
        if ($adress[2] !~ /^\d{15}00$/) {$error .= 'Не правильная улица<br>';} 
        
        if ($error ne ''){ ........  Что сюда вставить?.........}
}


PM MAIL   Вверх
Shaggie
Дата 18.5.2007, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

if ($error ne ''){ shift }

Так мы вытащим из внешнего массива нужный элемент, ведь на него указывает переменная $_


P.S. пардон, но я не понял... объясни, пожалуйста, у тебя переменная $error внешняя? Или локальная? Объяви её через out или му. И в любом случае нет смысла вставлять в неё новые строки оператором .= потому как в случае, если она локальная, хватит и одной ошибки, а если глобальная, то потрутся все элементы массива.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
amg
Дата 18.5.2007, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Наверное, проще не ломать голову со splice, а просто профильтровать массив:
Код

@adr = grep {
  my $error;
  my @adress=split(/##/,$_,7);
  if ($adress[0] !~ /^\d+$/) {$error .= 'Не правильный адрес<br>';}
  if ($adress[1] !~ /^\d{11}00$/) {$error .= 'Не правильный населённый пункт<br>';}
  if ($adress[2] !~ /^\d{15}00$/) {$error .= 'Не правильная улица<br>';} 
  ! $error;
} @adr;


PM MAIL   Вверх
johndes
  Дата 18.5.2007, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



запишу проще - надо удалить из элемента элемент равный 3

Код

my @a=(1,2,3,4,5,6,7,8,9,10);
foreach (@a){
              if ($_==3){.... что сдесь?(shift не работает)....}
}


конструкция с grep впринципе подходит
PM MAIL   Вверх
Anarki
Дата 18.5.2007, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



johndes, 
Код

#!/usr/bin/perl -w
use strict;
my @a=(1,2,3,4,5,6,7,8,9,10);
my $i = 0;
foreach (@a) {
    splice(@a,$i,1) if ($_==3);
    ++$i;
}



--------------------
PM WWW   Вверх
amg
Дата 18.5.2007, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



johndes, если нужно удалить из массива элементы, (не )соответствующие какому-либо критерию, то grep не просто в принципе подходит, он идеально подходит, для этого и был сделан.
Код

my @a=(1,2,3,4,5,6,7,8,9,10);
@a = grep { is_valid($_) } @a;

sub is_valid {
  my $element = shift;
  if ($element == 3) {
    return undef;
  }
  1
}


Anarki, твой код, к сожалению, не сработает, если в массиве имеются идущие подряд элементы, подлежащие удалению.

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


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

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


 




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


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

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