if ($filename =~ (.*)[/\\](.*)/)) {
$out_filename = $1;
}
Где ошибка в Cgi-скрипте??? Вот в чём вопрос!!!
#!C:/localhost/perl/bin/perl
use CGI;
$query = new CGI;
$upload_directory = "portraits";
if ($query->param('portrait')) {
&print_page_start;
&write_file;
&print_page_end;
}
else {
&print_page_start;
&print_form;
&print_page_end;
}
sub print_page_start {
print $query->header;
print "<html><head><title></title></head><body>\n";
print "<h2 align=\"center\">Upload </h2>\n";
}
sub print_page_end {
print "</body></html>\n";
}
sub print_form {
print "<form action=\"upload.pl\" methods=\"post\" enctype=\"multipart/form-data\">\n";
print "<input type=\"file\" name=\"portrait\">
\n";
print "<input type=\"submit\" value=\"upload\">
\n";
print "</form>\n";
}
sub write_file {
$filename = $query->param('portrait');
if ($filename =~ (.*)[/\\](.*)/)) {
$out_filename = $1;
}
else {
$out_filename = $filename;
}
print "$filename
\n";
$counter = 0;
while (-e "$upload_directory/$out_filename") {
$counter++;
$out_filename =~ s/^(.+)\.(.+)$/$1$counter\.$2/;
}
print "$filename
\n";
open (OUTFILE, "> $upload_directory/$out_filename");
while ($fytesread = read ($filename, $bufer, 1024)) {
print OUTFILE $bufer;
}
close $filename;
close OUTFILE;
}
sub print_success {
print "
The file was saved successfully.</P>\n";
}
Код:
полагаю что где то в условии.
$out_filename = $1;
}
где-то здесь!!! - выделено красным
Цитата:
Originally posted by Ihbif17
if ($filename =~ [COLOR=red](.*)[/\\](.*)/)) [/COLOR] {
$out_filename = $1;
}
где-то здесь!!! - выделено красным
if ($filename =~ [COLOR=red](.*)[/\\](.*)/)) [/COLOR] {
$out_filename = $1;
}
где-то здесь!!! - выделено красным
Я в perl никогда не кодил, но по-моему одна круглая закрывающая скобка лишняя.
хотя может это символ такой.
нет она не лишняя, убрав её ещё больше ошибок выдаёт [COLOR=red]!!!:!!!: :!!!: :!!!:[/COLOR]
*** оффтипик: Вспомнил на эту тему шутку "Лечу бесплодие методом тыка"
if ($filename =~ (.*)[/\\](.*)/)) {
$out_filename = $1;
}
Незабываем о разделителе.. Выходит в качестве разделителя у нас выступает кругляшка: '('..
Получается: разделитель .*)[/\\](.)/ разделитель
Нет, ну я конечно понимаю, что перл придумал лингвист, и этот самый perl оч. продвинутый и понимает юзера как родная мама.. Но всему есть предел:) Регулярка запарываеца из-за 3-его символа, она же правая круглая скобка, так как считает, что она должна иметь парную.. Ну вот так, ну вот такой вот глюк, экранируй ее, не экранируй, а он все-равно будет ругаться.. И правильно сделает.. Понимаетя, если в язык запихнуть все проверки которые только можно, чтобы все было безоблачно и т.п., он будет так лагааааать... Так лагать будет, что хрен кто им пользоваться станет.. С перлом поступили гораздо умнее, дали юзеру самому выбирать какой символ пойдет за разделитель.. Возьмите этот же регэксп не в круглые скобки, а ограничьте запятыми например.. Какой результат?? Работает?? правда?? Ну вот и молодцы.. ИМЕННО ДЛЯ ЭТОГО ОНИ И СУЩЕСТВУЮТ.. для разрешения таких проблем и более краткой записи, типа /\/\/\/(.*)\/\/\// и ,///(.*)///, ... Ну, я думаю поняли:)
Эт был первый вариант, кторый мне на ум пришел.. Птом посматрев на шаблон, я непонял честно говоря, на кой хер в конце стоит слэш??? Чутка подумав, я представил нюбая набивая исходник с книжки или как там еще и допустил, что он вполне мог пренебречь начальной скобкой.. Ну, проглядел, или еще как.. Со всеми бывает на самом деле.. Добавляем к
(.*)[/\\](.*)/) скобку в начало и получаем ((.*)[/\\](.*)/)... Вбиваем в скрипт, пробуем - работает.. Пучком, все хакей.. Кстати, думаю так и должно быть, с одной маленькой поправочкой, о которой скажу позже.. Должно быть так потому, что шаблон вида .*)[/\\](.*)/ больше похож на дикого зверя, чем на шаблон.. Скорее всего он начинается именно с группы, а не с N-ого количества символов, за которым идет правая скоба.. Это ведь очевидно, а? Думаю да.. Ну, кому нет, тому нет.. =)) Знач шаблон у нас все-таки должен иметь вид (.*)[/\\](.*)/, повторюсь, ШАБЛОН, это несчитая разделители.. Теперь о поправочке, конечный слэш мне тоже непонятен.. Это больше похоже на путь, который отсекает название файла, правда непонятно, почему потом в скаляр $out_filename забивается первое совпадение, а не второе.. Ну, знач тут нужен путь, а не имя, хрен с ним.. Но если мы выделяем путь до последнего разделителя [/\\] с учетом разницы (nix/win) путей, то пчему ж тогда на конце эта драча (/) светица? Тут в общем на ум сам собой пришел такой вариант регэкспа (с разделителями): /(.*)[/\\](.*)/.. И он тоже рабочий, так может ты (автор) втыкнул в конце лишнюю скобу, и забыл начальный слэш??? Как бы ни было это фантастично (допустить две таких нелепых помарки на одном месте), но такой вариант выглядит правдивее всего.. Попробуй для начала его, я вот лично большего всего верю именно в него:)) тогда под него подойдут варианты типа c:\files\bob.txt ($1 - c:\files, $2 - bob.txt), /usr/local/bin/sendmail ($1 - /usr/local/bin, $2 - sendmail) и т.п.. Ясененько??
Сразу скажу, исходник не смотрел, впадлу до немогу, устал за день.. Надеюсь я поймал волну и нигде не ошибся=)
ps: Да, ща глянул в сырец, все-таки скорее там имя файла нужно, чем путь к нему:) Меняем регэксп на: /.*[/\\](.*)/ (включая разделители)...;)