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


Автор: trinitr0 18.11.2013, 13:13
Пытаюсь написать простой пингер:

Код

#!/usr/bin/perl
my $ip = pop @ARGV;
 $ping =  "ping -c 1 -q $ip";
        @lines = `$ping`;
        for $line (@lines) 
        {
        if ($line =~ /\s+(\d+)% packet loss/)
            {            
                            if ($line eq '100')
                {print "FAILURE\n";}
                     else
                   {print "OK!\n";}
        }


но он в любом случае возвращает  всегда "OK".

Подскажите пожалуйста!

Автор: od0201 18.11.2013, 13:42
если 
if ($line =~ /\s+(\d+)% packet loss/) истина
то
if ($line eq '100') всегда будет ложью

попробуйте
if ($1 eq '100')

Автор: trinitr0 18.11.2013, 14:13
спасибо! Помогло!  smile 

Но можно пару слов объснения?

Код
if ($1 eq '100')


Что содержится в данном случае в $1?


Автор: Bulat 18.11.2013, 14:29
Цитата(trinitr0 @  18.11.2013,  13:13 Найти цитируемый пост)
(\d+)

Результат вышеуказанной конструкции в регулярном выражении. Подробно почитай хотя бы чуть-чуть про регулряные выражения в перл

Автор: od0201 18.11.2013, 14:34
$line =~ /\s+(\d+)% packet loss/
у Вас регулярное выражение (поиск в строке) где \d+ значает цифры в количестве 1 и более штук, 
() означают копирование их содержимого в $1,$2,$3..., в Вашем случае цифры, если они будут найдены упадут в $1
и $line остается неизменным при поиске...

Автор: trinitr0 18.11.2013, 15:59
Всё совершенно ясно! Я приблизетельно так  и предполагал что дело в ссылках назад, но небоьшой опыт не позволил достич полного просветления

Спасибо вам od0201 за развёрнутый ответ!

Bulat - тоже спасибки!


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