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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Начал учить perl. Профи - HELP! Помогите найти ошибки в скрипте. 
:(
    Опции темы
TheLeader
  Дата 19.11.2005, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ПОмогите найти ошибку. Скрипт работает некорректно.

Учу по самоучителю. Полностью переписал листинг. 2 часа мучался чтоб скрипт заработал - невышло.
Добавлено @ 02:43
Это простой скрипт отправки email...

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  l2.rar 1,71 Kb
PM MAIL ICQ   Вверх
korob2001
Дата 19.11.2005, 03:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Название темы должно отражать её суть. Код выкладывай в следующий раз сюда.
Подправил:
Код

#!/usr/bin/perl
use strict;

&get_form_data();
&send_email;
&print_thankyou_page;

my %FORM = ();

sub get_form_data {
    my $buffer;
    if ($ENV{'REQUEST_METHOD'} eq 'POST') {
         read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
    } else {
         $buffer = $ENV{'QUERY_STRING'};
    }

    $buffer =~ s/%(..)/pack("C",hex($1))/eg;
    $buffer =~ tr/+/ /;
    foreach my $pair (split(/&/, $buffer)) {
        my ($name,$value) = split(/=/,$pair);
        $FORM{$name} = $value;
    }
}


sub send_email {
    my $to = "user\@host.com";
    open (MAIL,"|/usr/sbin/sendmail -t -oi -odq") || die ("can't open sendmail");

    print MAIL "From: $FORM{'email'}\n";
    print MAIL "To: $to\n";
    print MAIL "Subject: Form submission\n\n";
    print MAIL "Name: $FORM{'name'}\n";
    print MAIL "Comany: $FORM{'company'}\n";
    print MAIL "Addres: $FORM{'address1'}\n";
    print MAIL "City: $FORM{'city'}\n";
    print MAIL "State: $FORM{'state'}\n";
    print MAIL "Country: $FORM{'country'}\n";
    print MAIL "Telephone: $FORM{'telephone'}\n";
    print MAIL "Fax: $FORM{'fax'}\n";
    print MAIL "E-mail: $FORM{'email'}\n";
    print MAIL "Services interested in: $FORM{'service'}\n";
    print MAIL "Notified when pages updated: $FORM{'notify'}\n";
    print MAIL "Comments: $FORM{'comments'}\n";

    close(MAIL);
}

sub print_thankyou_page {
    print "Content-type: text/html\n\n";
    print "<html>\n<head>\n<body bgcolor=\"#ffffff\">\n</head>";
    print "<h3>Thank you</h3>\n\n";
    print "<p>\n";
    print "Thank you for your submission\n";
    print "<p>\n";
    print "<a href=\"some_page.html\">Return</a> to the home page\n";
    print "</body\n</html>\n";
}

Проблема была в декодировании параметров, так же переменная окружения $ENV{CONTENT_LENGTH} была написана с ошибкой LENGHT, а так же проблема в пространствах имён, хеш %FORM не был обьявлен глобально, а используется в двух подпрограммах.

Если что-то не поймёшь, спрашивай.


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


MACMANIAC
**


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

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



А просто выложить сюда исходники через copy/paste? Качать как правило ломает, еще и rar-ом упакованный smile
Вот так надо задавать вопрос (это твой код):
Код

#!/usr/bin/perl

&get_form_data();
&send_email;
&print_thankyou_page;

sub get_form_data
{
    read(STDIN, $buffer, $ENV{ 'CONTENT_LENGHT' });
    @pairs = split(/&/, $buffer);
    foreach $pair (@pairs)
    {
        ($name, $value) = split(/=/, $pair);
        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9]{a-fA-F0-9])/pack("C", hex($1))/eg;
        $value =~ s/<!--(.|\n)*-->//g;
        $FORM{$name} = $value;
    }
}
sub send_email
{
    $to = "user\@host.com";
    open(MAIL, "|/usr/sbin/sendmail -t $to") || die ("can't open sendmail");
    print MAIL "From: $FORM{'email'}\n";
    print MAIL "To: $to\n";
    print MAIL "Subject: Form submission\n\n";
    print MAIL "Name: $FORM{'name'}\n";
    print MAIL "Comany: $FORM{'company'}\n";
    print MAIL "Addres: $FORM{'address1'}\n";
    print MAIL "City: $FORM{'city'}\n";
    print MAIL "State: $FORM{'state'}\n";
    print MAIL "Country: $FORM{'country'}\n";
    print MAIL "Telephone: $FORM{'telephone'}\n";
    print MAIL "Fax: $FORM{'fax'}\n";
    print MAIL "E-mail: $FORM{'email'}\n";
    print MAIL "Services interested in: $FORM{'service'}\n";
    print MAIL "Notified when pages updated: $FORM{'notify'}\n";
    print MAIL "Comments: $FORM{'comments'}\n";
    close(MAIL);
}

sub print_thankyou_page {
    print "Content-type: text/html\n\n";
    print "<html>\n<head>\n<body bgcolor=\"#ffffff\">\n</head>";
    print "<h3>Thank you</h3>\n\n";
    print "<p>\n";
    print "Thank you for your submission\n";
    print "<p>\n";
    print "<a href=\"some_page.html\">Return</a> to the home page\n";
}
print "</body\n</html>\n";

Теперь можно посмотреть что к чему smile
Во первых, всем, а особенно начинающим, рекомендуется в начале кода (срауз под #!/usr/bin/perl) включать
Код

use strict;
use warnings;
Это тебе поможет сразу увидеть все грубые ошибки. Грубая ошибка у тебя в том, что не заданы области видимости переменных. Получается что первая подрограмма заполняет хэш %FORM, но send_email о нем понятия не имеет. Значит вначале нужно указать что хэш %FORM должен быть виден из всех подпрограмм, либо передать send_email ссылку на этот хэш. Но и в этом случае переменные нужно обьявлять.
Код

#!/usr/bin/perl
use strict;
use warnings;
my %FORM;
get_form_data();
send_email();
print_thankyou_page();

sub get_form_data {
    my ($buffer, @pairs);
    read(STDIN, $buffer, $ENV{ 'CONTENT_LENGTH' }); # LENGTH!!!
    @pairs = split(/&/, $buffer);
    for my $pair (@pairs) {
        my ($name, $value) = split(/=/, $pair);
        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9]{a-fA-F0-9])/pack("C", hex($1))/eg;
        $value =~ s/<!--(.|\n)*-->//g;
        $FORM{$name} = $value;
    }
}

sub send_email {    
    my $to = "user\@host.com";
    open(MAIL, "|/usr/sbin/sendmail -t $to") || die ("can't open sendmail");    
    print MAIL "From: $FORM{'email'}\n";    
    print MAIL "To: $to\n";    
    print MAIL "Subject: Form submission\n\n";    
    print MAIL "Name: $FORM{'name'}\n";    
    print MAIL "Comany: $FORM{'company'}\n";    
    print MAIL "Addres: $FORM{'address1'}\n";    
    print MAIL "City: $FORM{'city'}\n";    
    print MAIL "State: $FORM{'state'}\n";    
    print MAIL "Country: $FORM{'country'}\n";    
    print MAIL "Telephone: $FORM{'telephone'}\n";    
    print MAIL "Fax: $FORM{'fax'}\n";    
    print MAIL "E-mail: $FORM{'email'}\n";    
    print MAIL "Services interested in: $FORM{'service'}\n";    
    print MAIL "Notified when pages updated: $FORM{'notify'}\n";    
    print MAIL "Comments: $FORM{'comments'}\n";    
    close(MAIL);    
}    

sub print_thankyou_page {    
    print "Content-type: text/html\n\n";    
    print "<html>\n<head>\n<body bgcolor=\"#ffffff\">\n</head>";    
    print "<h3>Thank you</h3>\n\n";    
    print "<p>\n";    
    print "Thank you for your submission\n";    
    print "<p>\n";    
    print "<a href=\"some_page.html\">Return</a> to the home page\n";
    print "</body\n</html>\n";
}

И еще, для обучения и опытов может и стоит самому принимать и обрабатывать параметры переданные скрипту, но правильнее и безопаснее использовать модуль CGI
Код

use CGI;
print header();

Ну и в твоем html файле нужно поправить methoh на method smile
Код

<form action="email.cgi" method="post"> 

Если не секрет, по какой книжке ты учишь perl? Почитай на форуме о рекомендуемой литературе и пользуйся ей. Так ты сэкономишь себе кучу времени и нервов, а кроме того научишься писать правильный и красивый код.



--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
TheLeader
Дата 20.11.2005, 05:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ой! Спасибо всем огромное!!!! smile smile smile

ps

Книга: Perl 5 веб-профессионалам
Авторы: Мика Браун, Крис Белью, Дэн Ливигстон.
Добавлено @ 05:47
А посоветуйте ещё прогу для написания пёрла? Нужна только подсветка синтаксиса. Никакой автоматизации, ибо человек юзающий прогу с автоматизацией никогда нормально программить не научится... =)
PM MAIL ICQ   Вверх
TheLeader
Дата 20.11.2005, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Написал очень простой скрипт гостевухи. Приметивный. Опять не работает =(

Вот код:

get_form_data.pl
Код

sub get_form_data
{
    read(STDIN, $buffer, $ENV{ 'CONTENT_LENGTH' } );
    @pairs = split(/&/, $buffer);
    foreach $pair (@pairs)
    {
        ($name, $value) = split(/=/, $pair);
        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $value =~ s/<!--(.|\n)*-->//g;
        if($FORM{$name} ne "")
        {
            $FORM{$name} .= "; $value";
        } else
        {
            $FORM{$name} = $value;
        }
    }
};


guestbook.html
Код

<HTML>
<HEAD>
<TITLE>ZAV perl guestbook</TITLE>
</HEAD>
<BODY BGCOLOR="AFAFAF">
<H2> Форма ввода </H2>
<FORM ACTION="guestbook-save.cgi" METHOD="POST">
<table border="0">
<tr>
<td height="55"><fieldset><legend>Имя</legend><input typ="text" name="name"></fieldset></td>
<td rowspan="2"><textarea name="comments" rows="5" cols="50" wrap="virtual"></textarea></td>
</tr>
<tr>
<td height="55"><fieldset><legend>Company</legend><input typ="text" name="company"></fieldset></td>
</tr>
<tr>
<td height="55"><fieldset><legend>E-mail</legend><input typ="text" name="email"></fieldset></td>
<td><table border="0" width="100%" height="100%"><tr align="center"><td><input type="submit" value="Зафигачить!"></td><td><input type="reset" value="Стереть все"></td></tr></table></td>
</tr>
</table>
</form>
</body>
</head>
</html>


guestbook-save.cgi
Код

#!/usr/bin/perl
require "get_form_data.pl";
 &get_form_data;
print "Content-type: text/html\n\n";
open(GUESTBOOK_IN, "./guestbook-view.html");
while(<GUESTBOOK_IN>)
{
    push(@guestbook, $_);
}
close(GUESTBOOK_IN);
open(GUESTBOOK_OUT, ">./guestbook-view.html");
$entry = "";
foreach $line (@guestbook)
{
    if($line ne "<!-- START HERE -->\n")
    {
        print GUESTBOOK_OUT $line;
    } else
    {
        print GUESTBOOK_OUT $line;
        $entry .= "\n\n";
        $entry .= "Name: $FORM{'name'} <a href=\"mailto: $FORM{'email'}</a>\n";
        $entry .= "<br>\n";
        $entry .= "Company: $FORM{'company'}\n";
        $entry .= "<br>\n";
        $entry .= "Comments:\n";
        $entry .= "<br>\n";
        $FORM{'comments'} =~ s/\s/\n<br>/;
        $entry .= "\n\n<hr>\n";
        print GUESTBOOK_OUT $entry;
    }
}
close (GUESTBOOK_OUT);
open (GUESTBOOK, "./guestbook-viev.html");
while (<GUESTBOOK>)
{
    print $_;
}
close (GUESTBOOK);
exit;



guestbook-view.html
Код

<HTML>
<HEAD>
<TITLE>ZAV perl guestbook</TITLE>
</HEAD>
<BODY BGCOLOR="AFAFAF">
<H2> Сообщения...</H2>
<!-- START HERE -->
<p>
<a href="guestbook.html">Вернуться в гостевуху</a>
</body>
</html>


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


MACMANIAC
**


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

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



Если первый пример скрипта был из книги, то выбрось ее пока не поздно! Начинать лучше всего с книги "Изучаем Perl" Р. Шварц, Т. Феникс, а продолжать изучение - "Программирование на Perl" и "Perl библиотека программиста". Все три книги издательства O'Reilley. Та что у тебя, это из разряда "Нейрохирургия за 21 день". Что касается редактора в котором удобно писать на Perl, то это зависит от того в какой ОС ты работаешь, в любом случае, не ленись использовать поиск по форуму, эта тема уже не раз обсуждалась, к примеру тут.
Ну и что касается твоего кода. Ты так и не воспользовался советами по поводу включения use strict; и use warnings;, это раз. Ты все равно не используешь модуль CGI, а зря, это два. У тебя считывание данных вынесено в отдельную процедуру и отдельный файл (при использовании модуля CGI в этом бы не было необходимости), ты ее подключаешь, вызываешь, но куда у тебя из нее возвращаются значения? Опять в локальный, для этой процедуры, хэш %FORM? Не говоря уже о том, что я вобще не вижу откуда у тебя в этом хэше берутся значения. Ты не потерял кусок кода? И главное, ты хочешь учить perl или тебе надо пару-тройку скриптов написать? Если хочешь учить, то старайся находить ошибки сам, потому как ничего загадочного у тебя тут нет, простая невнимательность.




--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
TheLeader
Дата 21.11.2005, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Т.к. у меня нет утренний, то в нете я соответственно только утром. Вчера днём нашел все ошибки. При включении use strict; и use warnings;, скрипт почемуто отказывается работать...
А книга на мо взгляд отличная, там очень хорошо комбинируется практика и теория.
PM MAIL ICQ   Вверх
sharq
Дата 21.11.2005, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

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



Цитата(TheLeader @ 21.11.2005, 08:26)
А книга на мо взгляд отличная, там очень хорошо комбинируется практика и теория.

Книга такая темно синия - Perl профессианалам (или что-то типа того).
Если честно - то книга сильно устарела и нужна только тем, кому не кайф самому думать и писать скрипты.


TheLeader тебе ведь советуют - использовать модуль CGI, ты попробуй, когда получится, будешь очень рад. smile

Цитата(TheLeader @ 21.11.2005, 08:26)
При включении use strict; и use warnings;, скрипт почемуто отказывается работать.

Не работает, потому что книга очень устарела! Все используемые переменные нужна описать через my - это как минимум.

В общем, мой тебе совет - забудь про эту книгу, perldoc CGI и книги O'Reilley (скачать их можно в разделе Компьютерная литература).

smile



--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
TheLeader
Дата 22.11.2005, 05:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ок. Спасибо большое. Ща гляну туды.... =))
PM MAIL ICQ   Вверх
TheLeader
Дата 22.11.2005, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А На русском языке нечего нету?
PM MAIL ICQ   Вверх
sharq
Дата 22.11.2005, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

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



TheLeader да там и на русском есть, что конкретно интересует?


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Guest
Дата 22.11.2005, 21:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Конкретно САМОУЧИТЕЛЬ по PERL'у для начинающих.
Желательно объяснения на практике. smile

  Вверх
TheLeader
Дата 22.11.2005, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нечаянно написал гстем. Пофигу. С.м. выше =)
PM MAIL ICQ   Вверх
sharq
Дата 23.11.2005, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

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



TheLeader качай
Изучаем Perl. Шварц Р., Кристиансен Т.
Специальный Справочник. Холснер

Это для начала.

Очень полезно будет скачать здесь в разделе perl книги
Том Кристиансен Perl: библиотека программиста,
Уолл Л., Кристиансен Т., Орвант Д. Программирование на Perl (3-е изд.).


smile



--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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