Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Не сложный вопрос PERL-специалисту

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Артем Р.
Гость





СообщениеДобавлено: Ср Окт 06 2004 18:34    Заголовок сообщения: Не сложный вопрос PERL-специалисту Ответить с цитатой

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

programme.pl:

if (var eq "run") {&chekpass;}
else {&passwordform;}

sub passwordform { print
...
<form action=programme.pl method=post>
<input type=hidden name="var" value="run">
<input type="password" name="pass">
<input type="submit" name="submit" value="Продолжить">
...
}

sub chekpass {
if($FORM{'pass'} eq $pass) {... &transfer...}
}

Далее в тексте sub transfer

<a href=programme.pl?page=$to>$num</a>

Вместо перехода на указанную страницу, получаю passwordform
Вернуться к началу
Витал



Зарегистрирован: 09.08.2004
Сообщения: 73

СообщениеДобавлено: Чт Окт 07 2004 03:51    Заголовок сообщения: Ответить с цитатой

1. - if (var eq "run") {&chekpass;}
2. - <a href=programme.pl?page=$to>$num</a>

Если это не опечатка,то должно быть
2. - <a href=programme.pl?page=$to>$run</a>
или посмотри,какое значение в этой переменной,у тебя в строке 1 происходит сравнение со значением "run" и соотвественно,если не совпадает то вызывается: else {&passwordform;}
В перле я не специалист,но при наличии всего кода мог бы чего посоветовать.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Витал



Зарегистрирован: 09.08.2004
Сообщения: 73

СообщениеДобавлено: Чт Окт 07 2004 03:54    Заголовок сообщения: Ответить с цитатой

Или попробуй просто вставить $to = "run",звиняюсь $num здесь не при чем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Alexandr 172



Зарегистрирован: 03.09.2004
Сообщения: 66
Откуда: Челябинск

СообщениеДобавлено: Чт Окт 07 2004 11:02    Заголовок сообщения: Ответить с цитатой

if ($var eq "run") {&chekpass;}
else {&passwordform;}
_________________
www.pay-ace.com/Ras254 - всем в подарок $150
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Артём Р.
Гость





СообщениеДобавлено: Чт Окт 07 2004 14:46    Заголовок сообщения: Ответить с цитатой

Нет, в приведённом коде нет опечаток, весь синтаксис проверен и приведён в кратком изложении. Единственное, первую строку следует читать как: if ($var eq "run") {&chekpass;}
Эту ошибку я допустил уже набирая код в форуме.

Более подробный код следует ниже, однако, если вы разобрались с первоначально приведённым, не стоит тратить время - ниже, ничего существенно важного не написано. На самом деле, я понимаю в чём проблема: при попытке передать скрипту programme.pl значение page=$to, скрипт не обрабатывает его, так как выполняется вторая строка else {&passwordform;}, котурую, в свою очередь вызывает первая, не находя значений $FORM{'var'} и $FORM{'pass'}


programme.pl:

if ($var eq "run") {&chekpass;}
else {&passwordform;}

sub passwordform {
print <<PASSFORM;
<html>
...
<form action=programme.pl method=post>
<input type=hidden name="var" value="run">
<input type="password" name="pass">
<input type="submit" name="submit" value="Продолжить">
...
</html>
PASSFORM
}


sub chekpass
{
if($FORM{'pass'} eq $pass) {
&beginhtml;
&mainpart;
&transfer;
&endhtml;
}else{ print "не правильный пароль";}
}


sub beginhtml
{
print <<BEGIN;
<html>
...
BEGIN
}


sub mainpart
{
здесь идёт продолжительный список операций, который выполняется правильно - к нему претензий нет
}


sub transfer
{

print "<tr align=\"center\" valign=\"middle\">\n";
print"<td><font class=link>Другая страница :</font>\n";
$allmass = int($all / $numberonpage)+1;
print "&nbsp;\n";
for($i=1;$i <= $allmass;$i++)
{
$to=$i*$numberonpage-$numberonpage;
$a=$page/10+1;
if($a ne $i)
{print " <a class=link href=programme.pl?page=$to>$i</a>&nbsp;";}
else
{print "<font class=link>$i</font>&nbsp;";}
}
print "\n</td></tr>\n";

}


sub endhtml
{
print <<ENDHTML;
...
</html>
ENDHTML
}

_________
Где:
$all = всего *****
$numberonpage = 12 ***** ввыводится на одну страницу
$i = номер страницы ($all/$numberonpage)
$to = соответствующая $i ссылка (например: <a class=link href=programme.pl?page=24>3</a>
$page = первоначальное (до перехода на другие страницы) значение 0 (ноль)
Вернуться к началу
Витал



Зарегистрирован: 09.08.2004
Сообщения: 73

СообщениеДобавлено: Пт Окт 08 2004 03:24    Заголовок сообщения: Ответить с цитатой

Теперь понял,попробуй вместо if ($var eq "run") {&chekpass;}
написать if ($var eq 'run') {&chekpass;}
В перле судя по всему рабрта со строковыми идет через одинарные кавычки или проверь значение переменной $var
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Alexandr 172



Зарегистрирован: 03.09.2004
Сообщения: 66
Откуда: Челябинск

СообщениеДобавлено: Пт Окт 08 2004 09:20    Заголовок сообщения: Ответить с цитатой

Если последний листинг достаточно полный, то непонятно кто такая $var, т.е. где оно инициализируется??
_________________
www.pay-ace.com/Ras254 - всем в подарок $150
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Витал



Зарегистрирован: 09.08.2004
Сообщения: 73

СообщениеДобавлено: Пт Окт 08 2004 10:32    Заголовок сообщения: Ответить с цитатой

<form action=programme.pl method=post>
<input type=hidden name="var" value="run">
<input type="password" name="pass">
<input type="submit" name="submit" value="Продолжить">
Как я понял,хотя могу и ошибаться $var - поле ввода и передается текущее значение.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Alexandr 172



Зарегистрирован: 03.09.2004
Сообщения: 66
Откуда: Челябинск

СообщениеДобавлено: Пт Окт 08 2004 11:16    Заголовок сообщения: Ответить с цитатой

Дык может проблема как раз в том и есть как из формы в переменную $var значение передается
_________________
www.pay-ace.com/Ras254 - всем в подарок $150
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Витал



Зарегистрирован: 09.08.2004
Сообщения: 73

СообщениеДобавлено: Пт Окт 08 2004 11:42    Заголовок сообщения: Ответить с цитатой

может быть,только ни у тебя ни у меня возможности проверить идею нет(ну хотя сильно изгольнуться),а автор куда то пропал,так что...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
FUKS



Зарегистрирован: 14.04.2002
Сообщения: 148
Откуда: Москва

СообщениеДобавлено: Пт Окт 08 2004 11:51    Заголовок сообщения: Ответить с цитатой

Витал писал(а):
<form action=programme.pl method=post>
<input type=hidden name="var" value="run">
...
Как я понял,хотя могу и ошибаться $var - поле ввода и передается текущее значение.

Вообще-то это значение попадает в переменную $ENV{var} (она же $ENV{'var'})...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Артем Р.
Гость





СообщениеДобавлено: Пт Окт 08 2004 14:33    Заголовок сообщения: Ответить с цитатой

Только без обид Very Happy
Имя темы "не сложный вопрос перл-специалисту" - по-моему подразумевает, что отвечающий должен немножко разбираться как в Perl, так и в html. Гадания откуда взялась переменная $var и как ей присваивается значение считаю, как бы это... Ага! как раз вот, так, как Вы подумали. Smile
Итак, переменная var ($var) передаётся программе автоматически из html-формы после нажатия на кнопку "Продолжить" (ничего заполнять не нужно - это можно понять прочитав input type=hidden) Заполнять нужно поле пароль ($pass), который и проверяется в случае, если скрипт получил значение $var ="run", в случае, если $var имеет другое значение (не равное "run"), или вообще скрипту не передаётся выводится html-форма кратко описанная в sub passform. Всё это становится понятно по прочтении первых двух строчек программы и sub passform.

Цитата:
Вообще-то это значение попадает в переменную $ENV{var} (она же $ENV{'var'})


Так точно, FUKS, операцию присвоения переменной $var значения $ENV{var} я опустил для краткости.

Ещё раз повторюсь: программа выполняется абсолютно правильно: выводится форма, спрашивается пароль, если он верен, правильно выполняется
&beginhtml;
&mainpart;
&transfer;
&endhtml;
Выводя, как можно понять, html-страницу на которой, в нижней части есть ссылки вида "1 2 3 4 5 6 7" (их туда засовывает sub trasrer), каждая из которых ведёт на следующую страницу ( так, на странице 1 отображаются блоки, к примеру картинки, с первой по двенадцатую, на второй, соответственно - с тринадцатой по двадцать четвёртую и так далее), так вот, для того, что бы перейти на вторую страницу и увидеть блоки (картинки ) под номерами 13-24, нужно нажать на цифру 2, которая, как вы уже догадались, является ссылкой вида "programme.pl?page=12" заставляющая Ваш браузер передать моей программе значение преременной page равное 12. Но моя программа команду вашего браузера проигнорирует решив, раз мне не пришло значение $var="run", да ещё и пароль не набран, а вместо этого всего подсовывают какое-то значение $page=12, пора выполнять &passform, и Вы, вместо картинок 13-24 увидите перед собой html-документ кратко описанный в sub passform (форма, где у вас спросят пароль)
Предвидя ваши рекомендации, сообщаю, что ссылка вида: programme.pl?var=run?pass=pass?page=12 - не работает, к тому же, передавать в адресную строку броузера значение пароля - не безопасно -- сами понимаете.
Вот такая кострукция, тоже почему-то работать отказалась:

Код:
(кратко)
if ($var eq "run") {&chekpass;}
elsif ($var eq "nopass") {&dowhatisayfuckingprogramm;}
else {&passwordform;}

[b]sub passwordform[/b] { print
...
<form action=programme.pl method=post>
<input type=hidden name="var" value="run">
<input type="password" name="pass">
<input type="submit" name="submit" value="Продолжить">
...
}

[b]sub chekpass[/b] {
if($FORM{'pass'} eq $pass) {$var="nopass";...&transfer...}
}

[b]sub dowhatisayfuckingprogramm[/b] {...&transfer...}

Далее в тексте sub transfer

<a href=programme.pl?var=nopass?page=$to>$num</a>

Но этот вариант ещё не достаточно дебагнут, и возможно - это ключ к решению ошибки.
Спасибо
Вернуться к началу
Alexandr 172



Зарегистрирован: 03.09.2004
Сообщения: 66
Откуда: Челябинск

СообщениеДобавлено: Пт Окт 08 2004 14:44    Заголовок сообщения: Ответить с цитатой

Цитата:
Гадания откуда взялась переменная $var и как ей присваивается значение считаю


Иногда ошибки скрываются в самых легкопонимаемых и простых местах...
Сделал бы вывод переменной $var до сравнения и посмотрел чему она равна, чтобы у нас не было сомнений по этому поводу
_________________
www.pay-ace.com/Ras254 - всем в подарок $150
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Scaramouch



Зарегистрирован: 11.01.2004
Сообщения: 143
Откуда: Столица нашей Родины

СообщениеДобавлено: Пт Окт 08 2004 14:48    Заголовок сообщения: Ответить с цитатой

А можно вопрос?
Что будет, если я просто в броузере наберу
http://yourhost/cgi-bin/programme.pl?var=nopass&page=3 ???

Есть такой механизм - сессии называется.
Специально для таких случаев придуман Smile
_________________
Ноги - это две лишние руки.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Артем Р.
Гость





СообщениеДобавлено: Пт Окт 08 2004 18:46    Заголовок сообщения: Ответить с цитатой

Alexandr 172, вы издеваетесь надо мной? Smile
Прочитайте пожалуйста внимательно мой последний пост - там я всё подробно расписал. Так подробно, что перечитывая, мне даже стыдно становится.

Scaramouch
Я так и пробовал, только почему-то всё равно пассформ.
А с сессиями не знаком, я вообще-то по-образованию и призванию больше экономист (маркетолог - конкретно), чем программист. Руководство поставило задачу сделать модный интерактивный сайт, а поскольку оказалось, что в компьютерах разбираюсь лучше всех я, да ещё и в художке 6 лет учился - ответственным за проект назначили меня, вот и парюсь. Буду признателен, если Вы кратко опишите механизм работы с сессиями.

Да! И кстати!!
Цитата:
programme.pl?var=nopass&page=3

Я всегда набирал programme.pl?var=nopass?page=3 - может, по-этому и не работает? Very Happy
Вернуться к началу
Витал



Зарегистрирован: 09.08.2004
Сообщения: 73

СообщениеДобавлено: Пн Окт 11 2004 04:18    Заголовок сообщения: Ответить с цитатой

Я сразу сказал что в перле не специалист,хотел как лучше получилось как всегда.Кстати насчет сессий-это вариант,как они реализованы-поискай в инете.А так у тебя как я понял первый раз страница отображается нормально,верно?У тебя при первом запуске перменная не равна "run" поэтому сабпассворд создает компонетн на форме- var дальше ты щелкаешь отправить и у тебя опять же в этот файл передается значение "run" и все прекрасно,только у тебя в данный момент нет инпута var и при следующем переходе опять попадаешь на пассворд,чем это лечиться - работой с переменными через сессии или вынеси создание инпута var в общий модуль,чтоб создавался в любом случае,а равнялся какому-либо значению исходя из условий,так тоже должно заработать.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Alexandr 172



Зарегистрирован: 03.09.2004
Сообщения: 66
Откуда: Челябинск

СообщениеДобавлено: Пн Окт 11 2004 09:36    Заголовок сообщения: Ответить с цитатой

Цитата:
Я всегда набирал programme.pl?var=nopass?page=3


Вот это уже ближе к пониманию причин неправильной работы скрипта.
И как раз очень просто (это к моему посту, о том что ошибка может быть простой)
_________________
www.pay-ace.com/Ras254 - всем в подарок $150
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Scaramouch



Зарегистрирован: 11.01.2004
Сообщения: 143
Откуда: Столица нашей Родины

СообщениеДобавлено: Пн Окт 11 2004 10:57    Заголовок сообщения: Ответить с цитатой

К сожалению, я Перл использую только для системного администрирования, а сайты делаю на ПХП, так что как реализованы сессии в перле, не знаю. Но можешь поискать на CPAN, там точно есть.
Но для твоей несложной задачи можно реализовать их самостоятельно.
Вкратце опишу механизм.
При поступлении логина/пароля от пользователя ты генеришь уникальный идентификатор сессии. Потом кладешь все поступившие данные и этот идентификатор в бд или в файл - как тебе больше нравится.
Потом каким-нибудь образом заставляешь клиента каждый раз передавать тебе этот идентификатор. ПХП, например, кладет этот ид в куки, а также присоединяет его ко всем ссылкам и во все формы вписывает хидден-поле с идентификатором. Ты наверняка видел URL'и, к которым приписано что-то вроде &PHPSESSID=84738c7308213941b8986f66d46d7e05 - это оно и есть.
По этому идентификатору ты и определяешь пользователя и получаешь доступ ко всем его переменным(логину, паролю и т.п.).
Естественно, эту сессию нужно хранить в течение определенного времени - в пхп по дефолту 24 минуты.

P.S. Да, формат query string именно такой, как я написал, то есть переменные разделяются &
P.P.S. Ты зря наехал на Александра - он тебе сказал очень умную вещь. Ты можешь думать про переменную что угодно, но если какое-то сравнение с ее участием не работает или работает не так, как должно, то первое, что ты должен сделать - это написать print $var; и явно посмотреть что она содержит, а потом подумать, почему она содержит не то, что тебе хочется Smile
P.P.P.S. И совет напоследок. Если есть возможность, постарайся убедить руководство обратиться к профессионалам. Они сделают качественнее, надежнее и обеспечат нужную поддержку. Не будешь же ты осуществлять поддержку сам, у тебя на это просто не хватит времени.
Я же не занимаюсь маркетинговыми исследованиями,почему же ты занимаешься моей работой?Smile
_________________
Ноги - это две лишние руки.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Гость






СообщениеДобавлено: Ср Ноя 17 2004 19:34    Заголовок сообщения: Ответить с цитатой

Посмотри хорошенько какую-нибудь статью про CGI. $ENV{'var'} не будет содержать то, что ты там хочешь прочитать. Если метод GET, то строка запроса полностью находится в $ENV{'QUERY_STRING'} если метод POST, ты ее читаешь из стандартного входа скрипта. Дальше разбираешь сам. Чтобы этого не было надо использовать модуль CGI.
Вернуться к началу
FUKS



Зарегистрирован: 14.04.2002
Сообщения: 148
Откуда: Москва

СообщениеДобавлено: Чт Ноя 18 2004 16:24    Заголовок сообщения: Ответить с цитатой

Гость писал(а):
$ENV{'var'} не будет содержать то, что ты там хочешь прочитать. Если метод GET, то строка запроса полностью находится в $ENV{'QUERY_STRING'}

Да, точно, что-то я тут напахал Embarassed
Код:

sub upc { # Раскодировка
  foreach (@_) {
    s/\+/ /g;
    s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
    s/'/\\'/g;
  }
}

if ($ENV{'REQUEST_METHOD'} eq 'POST') {
 read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
 $buf=$ENV{'QUERY_STRING'};
} else {
 $buf=$ENV{'QUERY_STRING'};
}

%parms=qw //;
@qs=split /&/,$buf;
foreach (@qs) {
 my($n,$v)=split /=/;
 &upc($v);
 $parms{$n}=$v
}
# Теперь %parms содержит параметры формы, в частности var лежит в $parms{var}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Гость






СообщениеДобавлено: Пт Ноя 19 2004 04:47    Заголовок сообщения: Ответить с цитатой

Все хорошо, кроме того, что ен учтено кодирование пробелов и прочих спецсимволов.

#---------------------------------------
use CGI qw (:standard);
$query = new CGI;
#@.....
#.... ANY CODE
#.....

$last_name = $query->param('last_name');
#------------------------------------------------------

Это использование стандартного модуля. Оно работает всегда и хорошо.

http://webmaster.xeno.ru/cgi_05_02.shtml
А здесь подробнее. И вообще там целый учебник...
Вернуться к началу
Гость






СообщениеДобавлено: Пт Ноя 19 2004 04:49    Заголовок сообщения: Ответить с цитатой

Сослепу не заметил декодирование в предпредыдущем посте. Но актуальность модуля CGI от этого не уменьшается.
Вернуться к началу
FUKS



Зарегистрирован: 14.04.2002
Сообщения: 148
Откуда: Москва

СообщениеДобавлено: Пт Ноя 19 2004 16:34    Заголовок сообщения: Ответить с цитатой

Да, так конечно элегантнее, просто не люблю дополнительными модулями пользоваться, даже стандартными, когда можно сделать ручками и без них, тоже вполне стандартно. По мне так лучше пользоваться сотней кирпичей для ВСЕГО, чем изучать тыщу крупнопанельных конструкций для каждого частного случая свою 8-)

"Да ежели всех вас помнить, то забудешь сколько водка стоит"(С)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Гость






СообщениеДобавлено: Пт Ноя 19 2004 18:49    Заголовок сообщения: Ответить с цитатой

Это уж дело вкуса, пока речь не идет о производстве кода с промышленной скоростью и в промышленных количествах. Кроме этого стандартные модули могут гораздо больше и они уже отлажены, а твой код еще нет.
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...