Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Два способа выполнить альтернативу


Автор: Danissimo 12.1.2007, 14:14
Выполняю такой код:
Код

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 строчку из первого варианта.

Автор: Nab 12.1.2007, 14:28
Потомучто smile
Код

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

Автор: amg 12.1.2007, 14:41
Ни за что бы сам не догадался:  (это я про себя)
Код

$> 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);
А лучше (и безопаснее, и понятнее) все три компонента оператора ?: в скобки заключать

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

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

Автор: tishaishii 12.1.2007, 17:03
Код
($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=(.*)';

Автор: Danissimo 15.1.2007, 12:04
Спасибо, перцы! Нормально накидали. Пошел учить =) Спасибо еще раз.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)