Программирование => Perl => Тема начата: commander от 14 Октября 2004, 11:10:50
Название: Загрузка файла...
Отправлено: commander от 14 Октября 2004, 11:10:50
Что-то я не очень понимаю... код такой: ------------------------------------------------------------ #!/usr/bin/perl -w use strict; use CGI qw(:param); my $file=param(\'FL\'); print "Content-type: text/html\\n\\n"; print "File: $file "; while (<$file>) { print; } print "File is load good!"; ------------------------------------------------------------ ниодин из загруженных файлов не отображаеться... в логах следующее: file.cgi: readline() on unopened filehandle at file.cgi line 8.
Кто-нить поясните что за бред!?
Название: Загрузка файла...
Отправлено: Forza от 14 Октября 2004, 11:53:23
А ты что хочешь сделать? Вывести на экран файл по имени, которое даёт функция param(\'FL\')?
Название: Загрузка файла...
Отправлено: NeoNox от 14 Октября 2004, 11:54:43
Действительно бред. Что у тебя здесь: <$file>. Имя файла? А что должно быть? Хендл открытого файла.
Название: Загрузка файла...
Отправлено: commander от 14 Октября 2004, 12:01:55
Forza хочу вывести имя файла и его содержание... NeoNox Цитирую: ----------------------------------- "Переменная, полученная с вызывающей веб-страницы, если расматривать ее как строку, будет строкой, содержащей имя файла, и, в зависимости от броузера, путь к нему. Но если рассматривать ее как дескриптор файла, она будет вести себя как дискриптор файла, и можно будет перебирать данные в ней, как в обычном файле. Спасибо, Линкольну Штайну"! Кевин Мельтцер. ----------------------------------- так что это не совсем бред...
Название: Загрузка файла...
Отправлено: NeoNox от 14 Октября 2004, 12:14:15
Мда. На заборе тоже кое-что написано. Ну и что? perldoc perldiag в руки. Кстати, откуда цитата?
Название: Загрузка файла...
Отправлено: Forza от 14 Октября 2004, 13:03:33
commander, а тебе чисто принципиально надо выводить файл вот таким методом? ;) Стандартное не подойдёт?
my $fileName = param (\'FL\'); open (SOURCE, "$fileName") or die "Couldn\'t open $fileName for reading: $!\\n"; print "Content-type: text/html\\n\\n"; print "File: $fileName "; while () { print $_.br();} close (SOURCE); [OFF]Набирал "по памяти" - надеюсь, без опечаток.[/OFF]
Название: Загрузка файла...
Отправлено: Phoinix от 14 Октября 2004, 13:19:30
commander
Хм... может трабла в форме??? Вот этот код у меня заработал:
#!/usr/bin/perl use strict; use CGI qw(param); print "Content-type: text/html; charset=windows-1251\\n\\n"; my $file = param(\'FL\'); if (!$file) { print "
Название: Загрузка файла...
Отправлено: commander от 14 Октября 2004, 13:19:44
NeoNox http://forums.webscript.ru/showthread.php?s=&postid=94155#post94155 Forza no coments... ;)
Название: Загрузка файла...
Отправлено: commander от 14 Октября 2004, 13:21:59
Phoinix твоя правда! :) заработало... спасиб!
Название: Загрузка файла...
Отправлено: NeoNox от 14 Октября 2004, 13:30:09
commander ты сам себе тщательно расставляешь грабли а потом других просишь их за тебя убрать. твой стиль написания кода называется "оптимистическим программированием". чуть что где сломается - дебажить будешь очень долго.
Название: Загрузка файла...
Отправлено: commander от 14 Октября 2004, 13:39:11
NeoNox
Цитировать
твой стиль написания кода называется "оптимистическим программированием". чуть что где сломается - дебажить будешь очень долго.
какие ваши предложения по улучшению моего стиля программирования? Для примера вот типичный мой код (сорри если очень большой): #!/usr/bin/perl -w use strict; use CGI qw(:standard); use CGI \':cgi-lib\'; use SQLayer; use HTML::Template; use lib \'../../\'; use Dms; my $D = SQLayer -> new(database =>\'DBI:Pg:dbname=comma;host=localhost;port=5432\',user=>\'user\', password=>\'secret\'); $D -> proc("SET CLIENT_ENCODING TO \'WIN\'"); my $action=param(\'action\'); if ($action eq "") { my $security_otdel_id=param(\'security_otdel_id\'); my $Data=$D->row_hash("SELECT list_post_id, name FROM list_post WHERE security_otdel_id=\'$security_otdel_id\'"); my $T = HTML::Template -> new(global_vars => 1, filename => "view_prov.tmpl"); print "Content-type: text/html\\n\\n"; $T -> param(abc=>$Data, security_otdel_id=>$security_otdel_id); print $T -> output(); } elsif ($action eq "add") { my %params = Vars; delete ($params{\'action\'}); my $table="list_post"; Dms->insert(params=>\\%params, table=>\\$table, D=>$D); print redirect(-uri=>"prov.cgi?security_otdel_id=".$params{\'security_otdel_id\'}.""); } elsif ($action eq "update") { my $security_otdel_id=param(\'security_otdel_id\'); my @list_id=$D->column("SELECT list_post_id FROM list_post WHERE security_otdel_id=\'$security_otdel_id\'"); my $table="list_post"; for my $el(@list_id) { my %params; $params{\'name\'}=param("name_$el"); my $where="list_post_id=$el"; Dms->update(params=>\\%params, table=>\\$table, D=>$D, where=>\\$where); } print redirect(-uri=>"prov.cgi?security_otdel_id=$security_otdel_id"); } elsif ($action eq "delete") { my $security_otdel_id=param(\'security_otdel_id\'); my $list_post_id=param(\'list_post_id\'); $D->row("DELETE FROM list_post WHERE list_post_id=\'$list_post_id\'"); print redirect(-uri=>"prov.cgi?security_otdel_id=$security_otdel_id"); }
Название: Загрузка файла...
Отправлено: Phoinix от 14 Октября 2004, 13:42:28
NeoNox
Вот кстати... о "оптимистическом программировании"... если имеется в виду upload файлов...
В чем принципиальное отличие между:
... my $upload = param(\'FL\'); my $file = \'some_file\'; open (FILE, ">$file"); flock (FILE, 2); binmode FILE; print FILE while (); close FILE; ...
и
... my $upload = param(\'FL\'); my $file = \'some_file\'; open (FILE, ">$file"); flock (FILE, 2); binmode FILE; while (read($upload, my $block, 1024)) { print FILE $block; }; close FILE; ...
???
Может где ошибся в коде... не проверял... тут вопрос о принципе... а то что-то никто не может объяснить разницу... точнее нет, в чем разница понятно, но что из этого можно назвать "оптимистичным кодом"???
Название: Загрузка файла...
Отправлено: Phoinix от 14 Октября 2004, 13:47:29
commander
О у меня -w в голове сразу начал "дебажжить"... даже не проверяю...
if ($action eq "")
Будет предупреждение... надо if (!$action)
вообще по уму я получаю переданные данные так:
my $action=param(\'action\') ? param(\'action\') : \'none\';
отпадает проблема инициализации...
Название: Загрузка файла...
Отправлено: NeoNox от 14 Октября 2004, 13:50:44
commander я сделал вывод только исходя из того что ты не орабатываешь исключительные операции. получая данные из вебформы(а там может быть все что угодно) ты оптимистично веришь что там то что тебе нужно. вот по этому такой стиль и называется "оптимистическим программированием". используя open и отработав ошибку открытия файла тебе бы не пришлось создавать эту тему.
Цитировать
commander: Для примера вот типичный мой код (сорри если очень большой):
большой. и тоже пример оптимистичного взгляда на получение параметра \'action\'. я заметил кучу elsif но без else. Как твоя программа поведет если я вызову скрипт /yourcode.cgi?action=whatthefuck ?
Название: Загрузка файла...
Отправлено: commander от 14 Октября 2004, 13:51:53
Phoinix тут безоговорочно согласен... только if ($action eq "") это у меня скорее дурная привычка.. сложившаяся уже года 2 назад... :)
Название: Загрузка файла...
Отправлено: commander от 14 Октября 2004, 13:54:58
NeoNox Error 500 :) ну сново повторяюсь... что подобное написание разбора параметра action это просто дурная привычка...
Название: Загрузка файла...
Отправлено: Phoinix от 14 Октября 2004, 13:56:52
commander
А вообще переменные я еще проверяю на наличие кавычек... нехорошо сразу в запрос запихивать переменную не проверив...
Название: Загрузка файла...
Отправлено: NeoNox от 14 Октября 2004, 14:00:25
Phoinix оба. исходщя из последних веяний в perl я могу сказать что open нужно вызывать с тремя параметрами а не с двумя: open (FH, ">" , "$filename") и не забывать обработать ошибку на открытии. дело в том, что если $filename будет иметь в своем названии управляющие символы, ты получишь не то что тебе нужно: $filename = \'>file\'; open (FH, ">$filename") Поблочная запись в файл нужна в редких случаях, а отработать ситуацию с неверным размером файла можно после записи его.
Название: Загрузка файла...
Отправлено: commander от 14 Октября 2004, 14:03:42
Phoinix тут опять же нельзя не согласиться... учту.. :)
Ещё нарикания?
Название: Загрузка файла...
Отправлено: commander от 14 Октября 2004, 14:09:04
NeoNox а как на счет скорости? что кстати не мало важно в нашем безумном времени... Я допустим уже 95% кода уже пишу на С++... так как не мне вам объяснать что Perl не самый быстрый язык...
Название: Загрузка файла...
Отправлено: NeoNox от 14 Октября 2004, 14:10:13
commander почитай perldoc perlsec. полезно иметь это ввиду.
Название: Загрузка файла...
Отправлено: NeoNox от 14 Октября 2004, 14:16:07
commander давай не будем религиозные войны здесь проводить. кривой код на асме будет исполняться дольше хорошо написанного в бейсике.