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


Автор: Alximik 21.7.2005, 00:46
Суть вопроста такова:

Есть форма (писана на wml) которая передает методом GET два параметра Ник и Сообщение

Код

print "Content-type:text/vnd.wap.wml\n\n";
require "head.pl";
print "<p align=\"center\">";

        print "Nick:<br/><input name=\"nick\" maxlength=\"20\" title=\"nick\" type=\"text\"/><br/>\n";
    print "Post:<br/><input name=\"post\" maxlength=\"200\" title=\"post\" type=\"text\"/><br/>\n";
    print "<anchor title=\"go\">Enter<go href=\"edd_post.pl\" method=\"get\"></go></anchor>\n";

print "</p>\n";
require "end.pl";


в фаил edd_post.pl в котором должны произойти прием и запись этих данных в текстовый фаил.

Как их записать я знаю
Код

open( FH, ">> gb.txt" ) or die $!;    
    # Добавляем строку в файл    
    print "$nick, $post!\n";    
# Закрываем файл    
close( FH );


(если ошибся в коде поправьте)

а вот как их принять? чтобы потом произвелась запись.

Прошу прощения за откровенно ламерский вопрос но просто только начал изучать perl третий день бьюсь неполучается.... отчаился решил написать... Неоткажите в помощи плз...

Автор: sharq 21.7.2005, 01:37
Alximik все через это проходили, а ты отчаянный, аж три дня бился smile
Все очень просто, параметры, которые передаются скрипту ты можешь получить, используя стандартный модуль CGI или в ручную. Я советую тебе юзать модуль CGI, потому что это просто smile

my.pl
Код

use strict; # прагма, которая накладывает некоторые правила и ограничения
use CGI qw(:standard); # подключение стандартного модуля CGI
use Fcntl qw(:flock); # этот модуль нужен для блокировки и разблокироваки файла

my $nick = param('nick'); # получение значения по ключевому значению nick
my $post = param('post'); # то же, только по post

open FILE, ">> gd.txt" or die "Can't open file: $!\n"; # открытие файла на дозапись
flock FILE, LOCK_EX;               # блокировка файла, чтобы никто его не изменял в этот момент
print FILE "$nick;;$post\n";    # запись в файл, лучше переменные разделять каким-нибудь  символом 
flock FILE, LOCK_UN;              # разблокировка файла 
close FILE;                              # закрытие файла



Только для того, чтобы этот скрипт обрабатывал введенную инфо с формы, нужно в форме указать, что этот скрипт является обработчиком данной формы, то есть:
form.html - это тебе для примера
Код

...
<form method="get" action="cgi-bin/my.pl">
 <input name="nick">
 <input name="post">
</form>
...


Надеюсь, разберешься.
smile

Автор: Usya 21.7.2005, 06:21
Загляни на http://www.ru-board.com/new/print.php?sid=47
Там с комментариями. Стандартная процедурка... Просто включаешь в скрипты, обрабатывающие формы и все...
Если в коде есть опечатки (всякое бывает), забей в поисковик фразу "Заменяем плюсы на пробелы" - получишь кучу ссылок с тем же самым кодом...
Удачи!

Автор: chaos 21.7.2005, 06:38
Цитата(sharq @ 21.7.2005, 01:37)
Код

print FILE, "$nick;;$post\n";   # запись в файл, лучше п


Код

close FILE;                                # закрытие файла
flock FILE, LOCK_UN;          # разблокировка файла 




1) наверное правельно будет записать так
print FILE "$nick;;$post\n"; (убрал запятую) тк если мне память не изменят перл выругается
2)унлок наверное надо делать до того как ты закрыл файл

Автор: Alximik 21.7.2005, 07:50
Всех благодарю за советы smile буду пробовать. Правдо на этом я от вас пожалуй неотстану smile Если можно напишите как заставить скрипт читать из файла последние 10 строк причем так что последняя на экран бует выводиться первой?

Автор: chaos 21.7.2005, 08:09
вот самый простой вариант
Код

#!/usr/bin/perl -w
use strict;

my (@cnt, $i);
my $N = 10;

open(F, "<t.txt") || die;
@cnt = <F>;
close(F);

for ($i = $#cnt; $i > ($#cnt-$N); $i--) {
  print $cnt[$i]; 
}

Автор: sharq 21.7.2005, 11:40
chaos
Цитата(chaos @ 21.7.2005, 06:38)
1) наверное правельно будет записать так
print FILE "$nick;;$post\n"; (убрал запятую) тк если мне память не изменят перл выругается
2)унлок наверное надо делать до того как ты закрыл файл


да именно так, просто не тестировал, а писал по памяти smile

Про чтение можно так:
Код
open FILE, 'gb.txt';
my @data = <FILE>;
close FILE;

print join "<br>\n", reverse @data;


Это точно работает. smile

Автор: chaos 21.7.2005, 11:54
Цитата(sharq @ 21.7.2005, 11:40)
chaos
Цитата(chaos @ 21.7.2005, 06:38)
1) наверное правельно будет записать так
print FILE "$nick;;$post\n"; (убрал запятую) тк если мне память не изменят перл выругается
2)унлок наверное надо делать до того как ты закрыл файл


да именно так, просто не тестировал, а писал по памяти smile


не думай что я на тебя бочку качу smile просто указал чтобы новечек не метался в поисках ошибки smile
Добавлено @ 11:57
Цитата(sharq @ 21.7.2005, 11:40)
Про чтение можно так:
Код
open FILE, 'gb.txt';
my @data = <FILE>;
close FILE;

print join "<br>\n", reverse @data;


Это точно работает. smile

Цитата
Если можно напишите как заставить скрипт читать из файла последние 10 строк причем так что последняя на экран бует выводиться первой?


а у тя он весь файл вываливает

Автор: sharq 21.7.2005, 12:03
chaos я и не думаю smile

Я показал как можно не париться с циклом, а обойтись станд. оператором.

А массив при создании, если так необходимо, можно ограничить только 10 записями.

И это уже пустяки...

smile

Автор: Usya 21.7.2005, 14:57
Вот и еще однин с удалением из массива просмотренных записей
Код

open FILE, 'gb.txt';
my @data = <FILE>;
close FILE;

for (my $i=0;$i<10;$i++) {print pop @data}

Вариантов достаточно много.
Все зависит того, что тебе нужно дальше и сколько у тебя записей...

Автор: Alximik 21.7.2005, 15:34
Сталкнулся с такой проблемой по таму методе как фаил должен читать все читает нормаьно а писать в фаил почемуто отказывается.... пользуюсь Деневером.... может както нужно chmod выставлять на *.txt ? если да то как это сделать на локальной машине и на Деневере в частности?

Автор: sharq 21.7.2005, 16:20
Alximik на какой оси ты запускаешь скрипт?
на Windows, тогда тебе права никакие не нужны.
если на nix, то файлам нужно поставить права: 0666.

если ты на Windows-платформе и не получается записать в файл, привели код и логи, если они есть.

smile

Автор: Alximik 21.7.2005, 18:58
Запускаю под Виндой

из формы передается вот в этот скрипт:
Код

use strict;
use CGI (:standard);
use Fcntl qw(:flock)
my $nick = param('nick');
my $post = param('post');

open FILE, ">> gb.txt" or die "Can't open file: $!\n";
flock FILE, LOCK_SH;
print FILE "$nick;;$post\n";
flock FILE, LOCK_UN;
close FILE;


а вот это log ошибок
Код

[Thu Jul 21 19:55:34 2005] [error] [client 127.0.0.1] Premature end of script headers: /home/localhost/cgi-bin/gb/my.pl
[Thu Jul 21 19:55:34 2005] [error] [client 127.0.0.1] Can't locate strict.pm in @INC (@INC contains: .) at \\home\\LOCALH~1\\cgi-bin\\gb\\my.pl line 2.\n
[Thu Jul 21 19:55:34 2005] [error] [client 127.0.0.1] BEGIN failed--compilation aborted at \\home\\LOCALH~1\\cgi-bin\\gb\\my.pl line 2.\n


Автор: wladk 22.7.2005, 10:21
Здается мне, что у тебя как то по кривому перл встал. По кривому, в смысле отсутсуют некоторые необходимые переменные окружения. В данном случаее @INC , в смысле в ней лежит только текущий каталог. "." А путей, к установленным модулям нету. Уверен, что такиеже сообщения тебя ждут для каждого из подсоединяемых модулей. Так что разбирайся с установкой.


Автор: Sadok 22.7.2005, 10:30
Alximik
Цитата
а вот это log ошибок

Чего-то я не понял, это лог Апача? Если да, то
Цитата
Premature end of script headers: /home/localhost/cgi-bin/gb/my.pl

говорит о том, что скрипт у тебя не выдает http-заголовки. Копать в сторону
Код
use CGI;                       # load CGI routines
$q = new CGI;                  # create new CGI object
print $q->header,              # create the HTTP header
$q->start_html('hello world'), # start the HTML
$q->h1('hello world'),         # level 1 header
$q->end_html;                  # end the HTML


Автор: Alximik 22.7.2005, 10:47
Лог выдаваемы программой Деневер кто незнает что это такое может ознаомиться вот тут http://www.denwer.ru/ как оказалось в даном пакете perl поставляется без стандартных библиотек этим думаю все и объясняется т.к. паралельно пользуюсь еще и AktivPerl он эту работу продеывает замечатеьно без косяков. Т.е. буду искать естьли на сайте разработчика стандартные perl библиотеки и модули.

Автор: sharq 22.7.2005, 11:27
Alximik просто у тебя нет прагмы strict, об этом лог и пишет. Поэтому отключи ее и запусти снова скрипт.

Поставь себе Apache+perl и проблем не будет. smile

Автор: Alximik 22.7.2005, 14:32
Цитата(sharq @ 22.7.2005, 11:27)
Alximik просто у тебя нет прагмы strict, об этом лог и пишет. Поэтому отключи ее и запусти снова скрипт.

Поставь себе Apache+perl и проблем не будет. smile

а что это за программа? можно ли ее както поставить? сечас поставил связку Small HTTP Server + perl начала ругаться вот на эту строчку
Код

use CGI (:standard); 


а еще возникла следующая проблема тоже как мне кажется довольно страная...

есть вот этот скрипт
Код

#!/usr/bin/perl
$i = "тест прошол удачно!";
open (FH, ">>test.txt") || die "error test.txt $!\n";
print FH "$i\n";
close (FH);


когда запускаю этот скрипт из командной строки он почемуто текст в *.txt файл недобовляет если же я запускаю его просто кликом мыши скрипт выполняется нормально в чем может быть дело? пользую все тоже ActivPerl.

Автор: Guest 22.7.2005, 22:57
Цитата(Alximik @ 22.7.2005, 14:32)
Цитата(sharq @ 22.7.2005, )
Alximik просто у тебя нет прагмы strict, об этом лог и пишет. Поэтому отключи ее и запусти снова скрипт.

Поставь себе Apache+perl и проблем не будет. smile

а что это за программа? можно ли ее както поставить?


http://httpd.apache.org/download.cgi

Только определись с версией. Желательно ставить туже, что и на предпологаемом хостинге. есть разница междку ветками 2,х и1,3,х
А перлsmile)) На верху страницы, буквально, есть такой раздел Правила раздела Perl: CGI программирование последний пунктsmile

Цитата

сечас поставил связку Small HTTP Server + perl


Путь настоящего самурая!:)

Цитата

начала ругаться вот на эту строчку
Код

use CGI (:standard); 



Не находит он этот модуль.... Может не входит в поставку.... вообщем попробуй его поставить...

Автор: Sadok 23.7.2005, 12:49
Alximik
Цитата
в чем может быть дело?

Пути разные.

Автор: Alximik 23.7.2005, 21:16
после переустановки perla в купе с Апачем начала выдавать вот это:
Код

syntax error at J:\shttps\www\cgi-bin\gb\my.pl line 3, near "(:" Execution of J:\shttps\www\cgi-bin\gb\my.pl aborted due to compilation errors.


собсевено вот код скрипта:
Код

#!/usr/bin/perl
use strict;
use CGI (:standard);
use Fcntl qw(:flock)
my $nick = param('nick');
my $post = param('post');

open FILE, ">> gb.txt" or die "Can't open file: $!\n";
flock FILE, LOCK_SH;
print FILE "$nick;;$post\n";
flock FILE, LOCK_UN;
close FILE;


т.е. если я правельно считаю синтаксическая ошибка вот тут:
Код

use CGI (:standard);


около "(:" как пишет сервак. что скажите? и кстати если я уберу use strict; какже мне тогда заставить скрипт принимать значения переменых $nick;;$post чтоб потом писать их в фаил?

Автор: Usya 24.7.2005, 07:22
Цитата
strict
Режим ограниченного использования "опасных" операторов


Спасает от глупых ошибок.
Немного подробнее здесь http://www.uic.vsu.ru/support/perlerror.htm
Если уверен, что все будет Ok, можешь не использовать...

Автор: sharq 24.7.2005, 10:34
Дорогой Alximik
Цитата(Alximik @ 23.7.2005, 21:16)
кстати если я уберу use strict; какже мне тогда заставить скрипт принимать значения переменых $nick;;$post чтоб потом писать их в фаил?

ты путаешь с модулем CGI smile

Код
use strict;
use CGI qw(:standard);
use Fcntl qw(:flock);

my $nick = param('nick');
my $post = param('post');

open FILE, ">> gb.txt" or die "Can't open file: $!\n";
flock FILE, LOCK_EX;
print FILE "$nick;;$post\n";
flock FILE, LOCK_UN;
close FILE;


найди отличие! smile

smile Читай документацию по модулю CGI smile

Молодец, что поставил Apache и perl.

smile

Автор: Alximik 30.7.2005, 23:20
возникла такая проблема из формы посыается все теже нещасные nick и post вот код формы (может ошибка в ней)

Код

#!/usr/bin/perl

use CGI qw(:standard);
print "Content-type:text/vnd.wap.wml\n\n";
require "head.pl";
print "<p align=\"center\">";

        print "Nick:<br/><input name=\"nick\" maxlength=\"20\" title=\"nick\" type=\"text\"/><br/>\n";
    print "Post:<br/><input name=\"post\" maxlength=\"200\" title=\"post\" type=\"text\"/><br/>\n";
    print "<anchor title=\"go\">Enter<go href=\"my.pl\" method=\"post\">";

        print "</go></anchor>\n";

print "</p>\n";
require "end.pl";



обробатывает этим данные файл my.pl который должен содержимое строк nick и post записать в текстовый файл
Код

#!/usr/bin/perl

use strict;
use CGI qw(:standard);
use Fcntl qw(:flock);
my $nick = param('nick');
my $post = param('post');
open FILE, ">> gb.txt" or die "Can't open file: $!\n";
flock FILE, LOCK_EX;
print FILE "$nick : $post\n";
flock FILE, LOCK_UN;
close FILE;


а он вместо этого почемуто пишет только : которое стоит между $nick и $post
Код

print FILE "$nick : $post\n";


как мне кажется косяк в форме может кто знаком с wml может помоч? или я неправ?

Автор: sharq 16.8.2005, 13:53
Alximik косяк в руках smile

Для того чтобы скрипт my.pl получил поля nick и post их необходимо передать в теге go!
Читай документацию по wml и все станет на свои места.

Код
#!/usr/bin/perl
use strict;
use CGI qw(:standard);

print "Content-type:text/vnd.wap.wml\n\n";

require "head.pl";

print <<WML;
<p align="center">
Nick:<br/><input name="nick" maxlength="20" title="nick" type="text"/><br/>
Post:<br/><input name="post" maxlength="200" title="post" type="text"/><br/>
<anchor>Enter
<go href="my.pl" method="post">
<postfield name="nick" value="\$(nick)"/>
<postfield name="post" value="\$(post)"/>
</go>
</anchor>
<br/>
<do label="Enter" type="accept">
<go href="my.pl" method="post">
<postfield name="nick" value="\$(nick)"/>
<postfield name="post" value="\$(post)"/>
</go>
</do>
</p>
WML

require "end.pl";


К сожалению, проверить не могу, по логике - вроде бы правильно.
Здесь используется два вида отправки данных обработчику.

В скрипте my.pl можешь сделать проверку: если nick и post пустые, то не писать в gb.txt.

smile

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