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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> формы, скрипты... Обьединение форм, скриптов. 
:(
    Опции темы
r
Дата 6.3.2005, 10:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Потрясающе, что называется красота в программировании. Если конечно есть возможность дай линк, на тот мануал где ты это
прочитал про CGI.pm. У меня есть, но какой-то кривой и неполный. Сразу-же начал переписывать все скрипты по новой. Возникли вопросы. Буду задавать их постепенно.
Код

unless ( $cgi->param('send') eq 'Отправить' ) {
    fun_1;
} else {
    fun_2;
}

Этот пример кода только с одной формой, а у меня их несколько, и в зависимости от данных переданных пользователем будет вызыватся какая-то из них, как мне поочерёдно принимать данные от них? Спасибо.

Это сообщение отредактировал(а) korob2001 - 8.3.2005, 01:50
  Вверх
korob2001
Дата 6.3.2005, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Если конечно есть возможность дай линк, на тот мануал где ты это прочитал про CGI.pm.

Сылку я уже давал, так же читай книги по CGI программированию, особенно хочется выделить такие как:
1. Программирование на CGI.pm ( эта книга написана Линкольном Штэйном, автором модуля CGI.pm ).
2. CGI программирование на Perl (Скотт Гулич, Шишир Гундаварам, Гюнтер Бирзнекс).
3. Разработка CGI приложений на Perl ( Кевин Мельтцер, Брент Михальски ).
Цитата

Этот пример кода только с одной формой, а у меня их несколько, и в зависимости от данных переданных пользователем будет вызыватся какая-то из них, как мне поочерёдно принимать данные от них?

Даже если у каждой формы поля с одинаковыми именами, то можно присвоить разные имена для кнопок типа SUBMIT, по ним определять какая из форм была передана CGI программе.


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


Unregistered











Цитата(korob2001 @ 6.3.2005, 16:04)
Даже если у каждой формы поля с одинаковыми именами, то можно присвоить разные имена для кнопок типа SUBMIT, по ним определять какая из форм была передана CGI программе.

Можно с этого момента поподробнее:))), т. к. как я только не пробовал.
Код

f($cgi->param('send')){
     show_form;
}else{
     fun1;
     fun2;
}

if ( $cgi->param('query') ) {
     fun3;
} else {
     fun4;      
}

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

Это сообщение отредактировал(а) korob2001 - 8.3.2005, 01:49
  Вверх
r
Дата 6.3.2005, 22:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

print $cgi->header( -charset => 'Windows-1251' );
unless ( $cgi->param('send') eq 'Отправить' ) {
       show_form;
} else {
       add_mess;
       show_form;
}


Я тут кое-что придумал правда где-то ошибка...
Код

unless( my $par_1=$cgi->param()){
if($par eq 'send'){
show_form2;
}elsif($par eq 'query'){
show_form3;
}
show_form1;
}


Это сообщение отредактировал(а) korob2001 - 8.3.2005, 01:47
  Вверх
korob2001
Дата 6.3.2005, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Насколько я поня, у тебя есть несколько форм на одной странице. Ты хочешь узнать какая из форм была передана, для этого присваиваешь разные имена кнопкам SUBMIT. Например имя этой кнопки для первой формы такое name => "form1", для кнопки второй формы name => "form".

Теперь можно определить, какая из форм была переданна, таким условием.

Код

if ( $cgi->param('form1') eq 'Отправить' ) {
    # Делаем что-то с данными полученными от первой формы
} elsif ( $cgi->param('form2') eq 'Отправить' ) {
    # Делаем что-то с данными полученными от второй формы
} else {
    # Этот блок выполним в том случае, если никаких данных не было передано.
}

Можно было бы сделать и такую проверку:
Код

if ( defined $cgi->param('form1') ) {
    # Делаем что-то с данными полученными от первой формы
} elsif ( defined $cgi->param('form2') ) {
    # Делаем что-то с данными полученными от второй формы
} else {
    # Этот блок выполним в том случае, если никаких данных не было передано.
}

Удачи.


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


Unregistered











Да, всё заработало, спасибо. Вопросы ещё остались. Первое, странно как-то у тебя блокируются файлы, где-то читал что блокировать надо дескриптор файла. Второе
раньше когда я не знал что такое CGI.pm у меня был такой код:

Код

open(FL,'<../www/file.txt')|| die "file.txt ERORR!!!\n";
while(<FL>){
print "<a href='/script.pl'>";
print;
print "</a><br>";
}
close(FL);


То есть открывал файл и выводил всё содержимое в броузер причем как видишь создавал линки на это содержимое с указанием скрипта который это обрабатывал. Теперь пытаясь обьединить все скрипты в один ума не приложу как это переписать. Скрипт просто сохранял текст линка в файл. Спасибо.

Это сообщение отредактировал(а) korob2001 - 8.3.2005, 01:42
  Вверх
korob2001
Дата 8.3.2005, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Да, всё заработало, спасибо. Вопросы ещё остались. Первое, странно как-то у тебя блокируются файлы, где-то читал что блокировать надо дескриптор файла.

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

open(FL,'<../www/file.txt')|| die "file.txt ERORR!!!\n";
while(<FL>){
print "<a href='/script.pl'>";
print;
print "</a><br>";
}
close(FL);

Я не дома, потому нижеприведённый код не тестировал, но он не сильно большой, потому думаю ошибок не будет.
Код

open(FL,'<../www/file.txt')|| die "file.txt ERORR!!!\n";
while ( <FL> ) {
    print $cgi->a( { -href => '/script.pl' }, $_ ), $cgi->br;
}
close( FL );

Удачи.

PS: возникнут трудности, пиши. И ещё:
При вставке кода, пользуйся кнопкой "Код". Предидущие посты я подправил, но как ты наверное понимаешь, я не буду делать это за тебя, постоянно. Все последующие сообщения в которых будет вставлен код без подсветки, будут удаляться. Облегчи труд всех участников, хотя бы этим.

Это сообщение отредактировал(а) korob2001 - 8.3.2005, 01:57


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


Unregistered











Привет korob2001, ты неправильно понял, смысл не в том как вставить линк. А в том что теряется идея обьединить все скрипты в один получается все равно вот так:
Код

<form action='http://localhost/cgi-bin/script.pl' method='POST'>
...
</form>

и вызывается другой скрипт, и не важно, сделано как линк или через форму.
Но это не важно, подумаешь будет два скрипта раз CGI.pm не совершенен.

Теперь другой вопрос вот html:
Код

<table width="100%" cellspacing="0" cellpadding="2" border="1">
 <tr><!-- Row 1 -->
   <td bgcolor="#0000FF">&nbsp;</td>
   <td bgcolor="#FF0000">&nbsp;</td>
   <td bgcolor="#0000FF">&nbsp;</td>
   <td bgcolor="#FF0000">&nbsp;</td>
 </tr>
 <tr><!-- Row 2 -->
   <td bgcolor="#FF0000">&nbsp;</td>
   <td bgcolor="#0000FF">&nbsp;</td>
   <td bgcolor="#FF0000">&nbsp;</td>
   <td bgcolor="#0000FF">&nbsp;</td>
 </tr>

</table>


А вот как с помощью CGI.pm:
Код

#!C:/Perl/bin/perl -w
use CGI;
my $cgi = new CGI;

sub show_form{
print $cgi->table( { -width => 400, -height => 400, -border => 1, -cellpadding => 5, -cellspacing => 0 }, ),
$cgi->Tr( [
$cgi->td( { -align => 'center', -bgcolor => 'blue',  -colspan => 2 },),
$cgi->td( { -align => 'center',  -bgcolor => 'red', -colspan => 2 },),
$cgi->td( { -align => 'center', -bgcolor => 'blue',  -colspan => 2 },),
$cgi->td( { -align => 'center',  -bgcolor => 'red', -colspan => 2 },),
  ] ),
$cgi->Tr( [
$cgi->td( { -align => 'center', -bgcolor => 'blue',  -colspan => 2 },),
$cgi->td( { -align => 'center',  -bgcolor => 'red', -colspan => 2 },),
$cgi->td( { -align => 'center', -bgcolor => 'blue',  -colspan => 2 },),
$cgi->td( { -align => 'center',  -bgcolor => 'red', -colspan => 2 },),
  ] ),

};


print $cgi->header( -charset => 'Windows-1251' );
print $cgi->start_html;
show_form;
print $cgi->end_html;


совершенно разное отображение, количество столбцов разное. Спасибо.
  Вверх
r
Дата 8.3.2005, 14:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Guest @ 8.3.2005, 10:50)
Но это не важно, подумаешь будет два скрипта раз CGI.pm не совершенен.

Виноват маэстро, простите, кривые руки.

Код

print $cgi->a( { -href => "script.pl?name='$_'"}, $_ ), $cgi->br;


Вот что мне надо было. Правда вот эти штуки остались ' ' вокруг текста в файле, ну это мелочи. Ну и здесь подправил:

Код

print $cgi->header( -charset => 'Windows-1251' );
if ( defined $cgi->param('form1') ) {
form1;
zak_vin;
} elsif ( defined $cgi->param('form2') ) {
form2;
}if ( defined $cgi->param(m/\sform3/) ) {
form3;
}else {
show_form;
};


А по таблицам вопрос не закрыт. Спасибо.

  Вверх
korob2001
Дата 9.3.2005, 04:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Вот что мне надо было. Правда вот эти штуки остались ' ' вокруг текста в файле, ну это мелочи.

Это само собой разумеется, убери эти символы из своего кода. Другими словами, просто замени эту строку:
Код

print $cgi->a( { -href => "script.pl?name='$_'"}, $_ ), $cgi->br;

на такую
Код

print $cgi->a( { -href => "script.pl?name=$_"}, $_ ), $cgi->br;

И найди отличие, тогда всё станет на свои места.
Цитата

А по таблицам вопрос не закрыт. Спасибо.

Не знаю на сколько правильно я тебя понял, постараюсь пояснить на примере:
Код

#!/usr/bin/perl -w
use strict;
use CGI;
my $cgi = new CGI;

# В следующем массиве укажи все нужные цвета, они будут чередоваться
my @colors = qw( red blue green yellow darkviolet );

# Следуюцая подпрограмма будет при каждом её вызове,
# по очереди, менять цвет  на следующий по индексу и
# возвращать тот цет, который она заменила.
sub change_color {
   my $color = shift @colors;
   # Работаем со стёком
   push( @colors, $color );
   return \$color;
}

print $cgi->header( -charset => "Windows-1251" );
print $cgi->start_html( -title => "Change Colors" ),
     $cgi->start_table( -border => 1 ),
     $cgi->start_Tr;

for my $num ( 0..99 ) {
     print $cgi->end_Tr, $cgi->start_Tr unless ($num % 10);
     print $cgi->td( { -width => 100,
                       -bgcolor => ${ change_color() },
                       -align => "center" } , "Ячейка номер $num" );
}

print $cgi->end_Tr,
     $cgi->end_table,
     $cgi->end_html;

Если хочешь выводить только 2 цвета, просто удали не нужные цвета из массива @colors и добавь дополнительный вызов функции в условной конструкции unless. Таким образом:
Код

#!/usr/bin/perl -w
use strict;
use CGI;
my $cgi = new CGI;

# В следующем массиве укажи все нужные цвета, они будут чередоваться
my @colors = qw( red blue );

# Следуюцая подпрограмма будет при каждом её вызове,
# по очереди, менять цвет  на следующий по индексу.
sub change_color {
   my $color = shift @colors;
   # Работаем со стёком
   push( @colors, $color );
   return \$color;
}

print $cgi->header( -charset => "Windows-1251" );
print $cgi->start_html,
     $cgi->start_table( -border => 1 ),
     $cgi->start_Tr;

for my $num ( 0..99 ) {
     unless ($num % 10) {
              change_color;
              print $cgi->end_Tr, $cgi->start_Tr;
     }
     print $cgi->td( { -width => 100,
                       -bgcolor => ${ change_color() },
                       -align => "center" } , "Ячейка номер $num" );
}

print $cgi->end_Tr,
     $cgi->end_table,
     $cgi->end_html;

Для чего мы добавили дополнительный вызов функции в unless, догадайся сам. Поэксперементируй с этим кодом, поробуй не добавлять вызов change_color, пробуй изменить условие в цикле и т.п.
Удачи.

Это сообщение отредактировал(а) korob2001 - 9.3.2005, 04:27


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


Unregistered











Привет Всем, особенно Комодераторам, последний пример был супер, не в плане цвета, а как пример, я переписал все формы!!!!!!! Думаю поискать книгу в инете, про этот чудный модуль CGI.pm, а то в нашем городке об этой книге никто даже не слышал, кто нибудь если знает хороший магазин пишите сюда. Ну и ещё есть вопросик, никак не могу убрать из строки первый символ может это из-за кирилицы. Спасибо.
  Вверх
korob2001
Дата 13.3.2005, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Допустим есть такая строка "тпривет, мир!", на выходе мы хотим видеть её, в таком виде "Привет, мир!".
Код

#!/usr/bin/perl -w
use strict;
my $str = "тпривет, мир!";
$str = substr( $str, 1 );
print $str;

теперь наша строка выглядит так "привет, мир", для того что бы преобразовать первый символ в верхний регистр, можно воспользоваться функцией ucfirst(), либо заюзать эскейп-последовательности, есть и другие способы, но эти пожалуй семые эффективные.
Код

#!/usr/bin/perl -w
use strict;
my $str = "тпривет, мир!";
$str = ucfirst( substr( $str, 1 ) );
print $str;

Заметь, что ничего не изменилось, строка так и осталась такой "привет, мир!". Причина в том, что некоторые функции Perl не всегда верно работают с символами кирилицы и теми языками где имспользуются диактрические знаки. Нам просто нужно подключить прагму use locale, она даёт компилятору команду использовать национальные установки из POSIX, её можно так же и отменить, таким способом no locale. Подправим вышеприведённый код:
Код

#!/usr/bin/perl -w
use strict;
use locale;
my $str = "тпривет, мир!";
$str = ucfirst( substr( $str, 1 ) );
print $str;

Теперь строка будет выглядеть так "Привет, мир!".
Вот так можно добиться того же эффекта, с помощью эскейп-последовательностей:
Код

#!/usr/bin/perl -w
use strict;
use locale;
print "\uпривет, мир!\n";
# или так
print "\Uп\Lривет, мир!\n";

Но это, на мой взляд не самый удобный способ, куда удобнее работать с функцией ucfirst(), хотя это тебе решать, как ты будешь обрабатывать строку.

Удачи.

Это сообщение отредактировал(а) korob2001 - 13.3.2005, 23:02


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


Unregistered











Спасибо, буду пробовать. Зайду если что.
  Вверх
r
Дата 23.3.2005, 22:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет Всем Постояльцам, тут вот закавыка вышла, первый символ я удалил, все нормально, а проблема вот в чем: у меня есть список у которого строки пронумерованы и когда необходимо удалить одну цифру это работает, но когда надо удалить например вот такое число: 1236?
С регулярными выражениями никак не подружусь. Спасибо.

P.s. У Вас ошибка на странице выскакивает. smile
  Вверх
korob2001
Дата 23.3.2005, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Привет Всем Постояльцам, тут вот закавыка вышла, первый символ я удалил, все нормально, а проблема вот в чем: у меня есть список у которого строки пронумерованы и когда необходимо удалить одну цифру это работает, но когда надо удалить например вот такое число: 1236?
С регулярными выражениями никак не подружусь. Спасибо.

Код

#!/usr/bin/perl -w
use strict;
my $str = "1225 Просто текст";
$str =~ s/^\s*?\d+\s*//;
print $str;

Этот код немного излишен, такак его цель удалить не просто цифру в начале строки, а ещё и символы пробела если таковые есть.

Удачи

Это сообщение отредактировал(а) korob2001 - 24.3.2005, 00:47


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


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

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


 




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


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

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