Неправильный ли путь к текстовому файлу моего плоского файла? Переход с Linux на сервер Windows - PullRequest
0 голосов
/ 06 апреля 2011

Я новичок в Perl. Я пытаюсь учиться на основе работ и книг предыдущего человека, таких как Learning Perl и Modern Perl . Я пытаюсь обновить этот скрипт, который интерпретирует данные из HTML-формы и записывает их в текстовый файл, поскольку в нашей лаборатории есть заинтересованность в том, чтобы запустить и запустить их снова. Оригинальный сценарий был написан для использования на сервере Linux, но с тех пор мы перешли с Linux на сервер Windows.

Сервер, к которому у меня нет прав администратора для просмотра сообщений об ошибках, - это сервер Windows с ActivePerl. У меня возникают трудности с поиском эквивалентного пути Windows, чтобы указать сценарию Perl, куда записывать информацию. Из разговора с администратором кажется, что наша интрасеть подключена к диску E:, хотя это может и не быть фатальной ошибкой.

Когда я пытаюсь запустить этот скрипт в браузере после того, как данные введены в форму, он просто возвращает универсальный:

CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP headers.

Любые советы, документация, учебные пособия приветствуются. Спасибо.

#!C:\perl\bin\perl.exe -w -t

# Good programming practice dictates...
use strict;
use warnings;

# CGI.pm -- makes life easy
#Carp qw(fatalsToBrowser); outputs the error messages to the browser since there is no terminal to output error messages to. Should be removed before script is used in production.
use CGI::Carp qw(fatalsToBrowser) or die "Problems loading CGI.pm";

# Initialize the CGI Interface
my($cgi) = new CGI;

# Print the Header
print $cgi->header();

#The dbmopen call is now de-appreciated. IE: it no longer works
#Kept for archival reasons
#if (! dbmopen(%DB, "/vol/research/docs/old_site_files/eyesignup/data/eyesignup_NEW.dat", 0666))
#   {
#   print "Error -- Cannot open database.\n";
#   exit;
#   }
# Tie is the correct way to do it now. But first we are going to experiment with writing to a flat .txt file.
open (Datastore, '>>',"E:/intranet/sds/research/docs/data.txt") or die "Can't open file: $!";



# Store variables and increment access count for this user
# So param('VARIABLE') is the name of the variables used in the HTML form while $custVARIABLE is the input for the database

my($custFirst) = $cgi->param('firstname');
my($custLast) = $cgi->param('lastname');
my($custGender) = $cgi->param('gender');
my($custAge) = $cgi->param('age');
my($custDiv) = $cgi->param('division');
my($custPhone) = $cgi->param('phone');
my($custEmail) = $cgi->param('email');
my($custEmployee) = $cgi->param('employee');
my($custInternet) = $cgi->param('internet');
my($custwww) = $cgi->param('www');
my($custDemographic) = $cgi->param('demographic');
my($custProjects) = $cgi->param('projectsworked');
my($custExperience) = $cgi->param('experience');
my($custWeekdays) = $cgi->param('Weekdays');

#Kept for archival reasons
#my($custName) = $cgi->param('name');
#my($custGender) = $cgi->param('gender');
#my($custDiv) = $cgi->param('division');
#my($custPhone) = $cgi->param('phone');
#my($custEmail) = $cgi->param('email');
#my($custInternet) = $cgi->param('internet');
#my($custwww) = $cgi->param('www');
#my($custDemographic) = $cgi->param('demographic');
#my($custExperience) = $cgi->param('experience');
#my($custTimes) = $cgi->param('times');
#my($custStudies) = $cgi->param('studies');
#$custTimes =~ s/\r\n/~/g;

#This takes the input and places it into an array, starting with the individual's
@InfoDB = $custFirst."|".$custLast."|".$custGender."|".$custAge."|".$custDiv."|".$custPhone."|".$custEmail."|".$custEmployee."|".$custInternet."|".$custwww."|".$custDemographic."|".$custProjects."|".$custExperience."|".$custWeekdays;
print Datastore (@InfoDB);
print "\n";

#Kept for archivival reasons.
#$DB{$custName} = $custGender."|".$custDiv."|".$custPhone."|".$custEmail."|".$custInternet."|".$custwww."|".$custDemographic."|".$custExperience."|".$custTimes."|".$custStudies;

#Kept for archival reasons. dbmclose is de-appreciated
#dbmclose(%DB);
#Instead use untie. But first we're just going experiment with using a flat storage system.
#untie(%DB);
close (Datastore) or die;

#Now inform the person their data has been saved. This is terribly ancient code so I haven't gotten around to fixing this part yet.
print "Content-type: text/html\n\n";

print "<HTML>
<HEAD>
<TITLE>Thank you!</TITLE>
</HEAD>
<BODY>";

print "<H1><U>Thank You ".$custFirst."\!</U></H1>
<P>We appreciate your assistance.</P>
<HR width=\"75%\">";

print "<P><H3>The following information has been recorded:</H3>
Name: <I>".$custFirst."</I></p><P>
Gender: <i>".$custGender."</i></p><p>
Division: <i>".$custDiv."</i></p><p>
Phone: <i>".$custPhone."</i></p><p>
Email: <i>".$custEmail."</I></p><P>
How often do you use the internet?: <i>".$custInternet."</i></p><p>
How often do you visit the website?: <i>".$custwww."</i></p><p>
Are you familiar with demographic data?: <i>".$custDemographic."</i></p><p>
Do you have work experience in economics, business, or a related field?: <i>".$custExperience."</i></p><p>
Weekdays that you are available: <i>".$custWeekdays."</i></p><p>
";

print "
</BODY>
</HTML>";

Я внес несколько изменений, чтобы компенсировать некоторые ограничения, в которых я работаю. Например, временно выводить ошибки в браузер, пока я не заработаю. И переход от старого вызова dbmopen (который больше не работает) к хранилищу плоских файлов.

Ответы [ 5 ]

1 голос
/ 06 апреля 2011

use CGI::Carp qw(fatalsToBrowser) or die "Problems loading CGI.pm"; ваша проблема.

$ perl -wle 'use CGI::Carp qw(fatalsToBrowser) or die "Problems loading CGI.pm";'
syntax error at -e line 1, near "qw(fatalsToBrowser) or"
Execution of -e aborted due to compilation errors.

Ваша программа умирала во время компиляции, поэтому вы не получили никакой полезной синтаксической ошибки. Обычно вы сможете увидеть это в своих журналах, но вы не можете. or die не требуется (и синтаксическая ошибка) в операторе use. Это уже выдаст ошибку.

Вам действительно, очень нужна копия Perl на вашем локальном компьютере, чтобы протестировать ваши программы. Используйте это как боеприпасы. Если они по-прежнему не позволяют использовать инструменты, используйте переносную версию Strawberry Perl , не требующую установки.

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

1 голос
/ 06 апреля 2011

Существует несколько хороших ресурсов о том, как отлаживать сценарии CGI.pm из командной строки:

Я предлагаю вам взглянуть на эти методы.

1 голос
/ 06 апреля 2011

У вас есть следующие строки:

# Print the Header
print $cgi->header();

и далее вниз:

#Now inform the person their data has been saved. This is terribly ancient code so I haven't gotten around to fixing this part yet. 
print "Content-type: text/html\n\n";

Обе делают одну и ту же вещь - вы печатаете один и тот же заголовок типа контента дважды.Вы можете удалить один или другой вызов print.Также быстро просмотрите ссылки на header() в CGI.pm документах , чтобы увидеть другие вещи, которые вы можете сделать.

0 голосов
/ 06 апреля 2011

Еще одно предположение, которое, вероятно, не имеет ничего общего с проблемой, но является лишь вопросом избыточности:

#!C:\perl\bin\perl.exe -w -t

Флаг -w - это то же самое, что и:

use warnings;
0 голосов
/ 06 апреля 2011

Кроме того, как грубый удар в темноте:

open (Datastore, '>>',"E:/intranet/sds/research/docs/data.txt") or die "Can't open file: $!";

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

Помимо исправления вызова print, вы также можете заменить путь на:

E:\intranet\sds\research\docs\data.txt
...