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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Perl - начало изучения. Вопросы связанные с изучением Perl. 
:(
    Опции темы
Vldmir
Дата 15.7.2009, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем здарова! smile  По рекомендациям опытных начал изучение Perl по книге Р. Шварца и Т. Кристиансена "Изучаем Perl", но на определённом этапе освоения материала начались сложности. Программа почему то работает не корректно, хотя код в точности совпадает скнижным вариантом, а также были выполнены все пункты по размещению файлов секретных слов с расширением *.secret в рабочем каталоге. Там же были размещены файлы для записи базы данных lastdb.dir и lastdb.pag. Вот код программы:
Код

#!/usr/bin/perl -w
&init_words ( );
   print "What is your name? ";
   $name = <STDIN>;
   chomp ($name) ;
 if ($name =~ /^randal\b/i) {                             # обратно на другой путь :-) 
    print "Hello, Randal! How good of you to be here!\n";
}else {
     print "Hello, $name! \n";                               # обычное приветствие 
     print "What is the secret word? ";
     $guess = <STDIN>;
     chomp $ guess;
   while (! good_word( $name, $guess)) {
     print "Wrong, try again. What is the secret word? ";
     $guess = <STDIN> ;
     chomp $guess;
   } 

     dbmopen (%last_good, "lastdb", 0666);
     $last_good[$name] = time;
     dbmclose (%last_good);
sub init_words {
   while ($filename =<*.secret>) { 
     open (WORDSLIST, $filename) ||
                                                  die "can't open $filename: $!";
    if (-M WORDSLIST < 7) {
        while ($name = <WORDSLIST>) { 
      chomp ($name);
      $word = <WORDSLIST>;
      chomp ($word);
      $words[$name] = $word;
      }
  }else {                                                             # rename the file so it gets noticed
      rename ($filename, "$filename.old") ||
                                                    die "can't rename $filename.old: $!";
   }
close WORDSLIST;
   }
}
sub good_word {
      my($somename,$someguess) = @_;             # перечислить параметры
      $somename =~ s/\W.*//;                              # удалить все символы, стоящие после первого слова
      $somename =~ tr/A-Z/a-z/;                         # перевести все символы в нижний регистр
    if ($somename eq "randal") {                          # не нужно угадывать
     return 1;                                                       # возвращаемое значение — "true"  
   } 
    elsif (($words[$somename] || "groucho") eq $someguess) {
     return 1;                                                       # возвращаемое значение — "true" 
   }else {
      open MAIL, "| mail YOUR_ADDRESS_HERE";
      print MAIL "bad news: $somename guessed $someguess\n";
      close MAIL;
     return 0;                                                       # возвращаемое значение — "false"
   }
}


А вот сведения об ошибках, выдаваемых интепретатором Perl:
user posted image
Так как, пока нехватает опыта самостоятельно решить подобные задачи, обращаюсь за помощью для устранения представленных ошибок.
Заранее благодарен! smile 
PM MAIL   Вверх
gcc
Дата 15.7.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



Код

#!/usr/bin/perl -w

Код

#!/usr/bin/perl


если скрипт маленький, варнинги можно не включать
PM WWW ICQ Skype GTalk Jabber   Вверх
Vldmir
Дата 15.7.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хорошо удалил ключ -w , но программа опять же выполняется некорректно:
user posted image
Хотя введённое имя соответствует секретному слову. Похоже здесь уже прдупреждение выводит командная строка. smile 
PM MAIL   Вверх
DaemonSuw
Дата 15.7.2009, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



      open MAIL, "| mail YOUR_ADDRESS_HERE"; - ну вот эта штука не для винды) перенаправьте просто в файл
хотя может и есть какие нибудь консольные дискриптовые отсыльщики, но у вас ясно они не стоят(

Это сообщение отредактировал(а) DaemonSuw - 15.7.2009, 17:48
PM MAIL ICQ   Вверх
Vldmir
Дата 15.7.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А где можно почерпнуть информацию о файловых отсыльщиках для винды и об их установке.
PM MAIL   Вверх
Itsys
Дата 15.7.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Vldmir, ищи sendmail for windows
PM MAIL WWW Skype   Вверх
Vldmir
Дата 15.7.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, будем действовать! smile 
PM MAIL   Вверх
DaemonSuw
Дата 15.7.2009, 21:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Vldmir, да вы бы не мучались с администрирование винды, а писали бы просто в файл:

Код

open MAIL, ">C://mail.txt";
print MAIL "bad news: $somename guessed $someguess\n";
close MAIL;


MAIL - это дескриптор файла...
print MAIL '' - печать в этот дескриптор, то есть по сути в файл...
close - закрытие файла и сохранение данных
с mail в примере будет тоже самое только с помощью внешней утилиты mail, которая в качестве аргументов получает е-майл и тело письма, если я правильно понял пример... 


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


Новичок



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

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



DaemonSuw, cпасибо за совет. В случае использования приведённого выше кода, ясно программа отправляет сообщение в файл при набранном неправильном секретном слове, или если срок со времени создания секретного слова превысил 7 дней. 
 Но что касается отправки сообщения на адрес электронной почты при помощи SendMail, здесь похоже помимо установки самого SendMail, необходима установка веб-сервера.   
 Да, и ещё вопросик при выполнении кода программы:
Код

#!/usr/bin/perl -w
&init_words ( );
   print "What is your name? ";
   $name = <STDIN>;
   chomp ($name) ;
 if ($name =~ /^randal\b/i) {                             # обратно на другой путь :-) 
    print "Hello, Randal! How good of you to be here!\n";
}else {
     print "Hello, $name! \n";                               # обычное приветствие 
     print "What is the secret word? ";
     $guess = <STDIN>;
     chomp $ guess;
   while (! good_word( $name, $guess)) {
     print "Wrong, try again. What is the secret word? ";
     $guess = <STDIN> ;
     chomp $guess;
   } 

     dbmopen (%last_good, "lastdb", 0666);
     $last_good[$name] = time;
     dbmclose (%last_good);
sub init_words {
   while ($filename =<*.secret>) { 
     open (WORDSLIST, $filename) ||
                                                  die "can't open $filename: $!";
    if (-M WORDSLIST < 7) {
        while ($name = <WORDSLIST>) { 
      chomp ($name);
      $word = <WORDSLIST>;
      chomp ($word);
      $words[$name] = $word;
      }
  }else {                                                             # rename the file so it gets noticed
      rename ($filename, "$filename.old") ||
                                                    die "can't rename $filename.old: $!";
   }
close WORDSLIST;
   }
}
sub good_word {
      my($somename,$someguess) = @_;             # перечислить параметры
      $somename =~ s/\W.*//;                              # удалить все символы, стоящие после первого слова
      $somename =~ tr/A-Z/a-z/;                         # перевести все символы в нижний регистр
    if ($somename eq "randal") {                          # не нужно угадывать
     return 1;                                                       # возвращаемое значение — "true"  
   } 
    elsif (($words[$somename] || "groucho") eq $someguess) {
     return 1;                                                       # возвращаемое значение — "true" 
   }else {
      open MAIL, "| mail YOUR_ADDRESS_HERE";
      print MAIL "bad news: $somename guessed $someguess\n";
      close MAIL;
     return 0;                                                       # возвращаемое значение — "false"
   }

 

 когда введено имя и соответствующее ему секретное слово, программа выводит опять тот же запрос:
user posted image
и понятно посылает сообщение в файл, хотя время созданных файлов секретных слов не привышает 7 дней.
Например, если ввести используемое по умолчанию для всех имён секретное слово "groucho" 
прграмма завершается удачно.
PM MAIL   Вверх
Slauta
Дата 21.7.2009, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Оторванный от жизни
*


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

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



Я тож изучаю пэрл по этой книжке, там много неточностей, приходилось подгонять под винду либо пробовать под линукс, но на линуксе проктически 50% всех ошибок, теже что и на винде. Я так думаю, что книжка врод писалась 1998 году, а с тех пор много времени прошло, да и та самая винда изменилась (хотя наверн пэрл не был расчитан на 98 винду, а ток на линуксы). Так что эта книжка хорошэнько тренерует мозги...
--------------------
Хм...
PM MAIL WWW ICQ Skype   Вверх
shamber
Дата 21.7.2009, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Vldmir @  16.7.2009,  12:06 Найти цитируемый пост)
десь похоже помимо установки самого SendMail, необходима установка веб-сервера.   

почему?
PM MAIL Jabber   Вверх
Vldmir
Дата 21.7.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



shamber, поправлюсь, я хотел лишь упомянуть, что сервер можно использовать как один из вариантов проверки удачной отправки почты, применяя Perl-скрипт. Например, в дистрибутив Denver'а входит sendmail для проверки отправки почтовых сообщений. Но также не исключаю, что для выполнения подобной задачи можно применить ряд специальных модулей . 

Это сообщение отредактировал(а) Vldmir - 21.7.2009, 20:37
PM MAIL   Вверх
KSURi
Дата 21.7.2009, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



На самом деле не sendmail, а заглушка, которая пишет в файл. Во всяком случае, так было года два назад)

Это сообщение отредактировал(а) KSURi - 21.7.2009, 23:26


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


Новичок



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

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



 Если я вас правильно понял, то принцип использования sendmail на Denver'е, аналогичен принципу отправки сообщения из Perl- скрипта в файл? 
PM MAIL   Вверх
shamber
Дата 21.7.2009, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



да

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


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

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


 




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


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

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