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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Два способа выполнить альтернативу, Объясните, почему работает только один 
V
    Опции темы
Danissimo
Дата 12.1.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Выполняю такой код:
Код

foreach (...) {
    /device=(.*)macaddr=(.*)ip=(.*)netmask=(.*)/ and do {
        my $ip = $3;
        $ip  =~ /(\d+.\d+.\d+.\d+)/ ? $ip = $1 : $ip = undef;
    }
}


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

foreach (...) {
    /device=(.*)macaddr=(.*)ip=(.*)netmask=(.*)/ and do {
        my $ip = $3;
        if ($ip  =~ /(\d+.\d+.\d+.\d+)/) { $ip = $1 } else { $ip = undef }
    }
}


Однако, это не так: в первом варианте после 4 строчки $ip всегда = undef. Почему? Как perl интерпретирует 4 строчку из первого варианта.

Это сообщение отредактировал(а) Danissimo - 12.1.2007, 14:15
PM MAIL   Вверх
Nab
Дата 12.1.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Потомучто smile
Код

foreach (...) {
    /device=(.*)macaddr=(.*)ip=(.*)netmask=(.*)/ and do {
        my $ip = $3;
        ($ip  =~ /(\d+.\d+.\d+.\d+)/) ? $ip = $1 : ($ip = undef);
    }
}


Это сообщение отредактировал(а) Nab - 12.1.2007, 14:43


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


Эксперт
***


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

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



Ни за что бы сам не догадался:  (это я про себя)
Код

$> perl -MO=Deparse,-p -e '$ip  =~ /(\d+.\d+.\d+.\d+)/ ? $ip = $1 : $ip = undef;'
((($ip =~ /(\d+.\d+.\d+.\d+)/) ? ($ip = $1) : $ip) = undef);
А так сразу понятно, где отличие от выражения c if else. Т.е. нужно, как минимум, 
Код

$ip  =~ /(\d+.\d+.\d+.\d+)/ ? $ip = $1 : ($ip = undef);
А лучше (и безопаснее, и понятнее) все три компонента оператора ?: в скобки заключать

Это сообщение отредактировал(а) amg - 13.1.2007, 12:04
PM MAIL   Вверх
korob2001
Дата 12.1.2007, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Думаю, что лучше будет перенести присваивание вначало. Да и перед точками нужно слэши расставить.
Код

$ip = $ip =~ /(\d+\.\d+\.\d+\.\d+)/ ? $1 : undef;


Это сообщение отредактировал(а) korob2001 - 12.1.2007, 15:51


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
tishaishii
Дата 12.1.2007, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


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

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



Код
($ip)=$ip=~/^(\d+\.\d+\.\d+\.\d+)$/
 и вся заморочка, а то ещё какое-то условие, да ещё какой-то undef.
Ну, а вобщем:
Код
($ip)=(/device=(.*)macaddr=(.*)ip=(.*)netmask=(.*)/)[2]=~/(\d+\.\d+\.\d+\.\d+)/
            foreach 'device=(.*)macaddr=(.*)ip=127.0.0.1netmask=(.*)';

PM MAIL ICQ Skype   Вверх
Danissimo
Дата 15.1.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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


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

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


 




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


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

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