If nothing prints to the browser then you have a problem with your script that has nothing to do with your regex. The BEGIN block prints a valid header (as every CGI script must). It does not stop your script from printing a valid header, so *at the very least* you should get some header info in the browser window - this is the header info you script would output without the BEGIN block. If you do not your script is not printing a valid header (nor anything else if you do not see anything in the browser window). You will need to post a link to the full script or post it here as the problem is not the regex as you suggest.
cheers
tachyon
s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print
| [reply] |
Here is the loop that is reading from the file, as requested. The whole script is a couple hundred lines, I can post it if you think it's necessary, but I think the problem is here. I'm using strict and warnings, just so you know.
my $HTML = $query->param(-name=>"file");
print $query->header;
print $query->start_html("Class Schedule");
while (<$HTML>) {
# if (/SEE SCHEDULE OF CLASSES/) {
# next;
# }
if (/^<(?:TR).*?>(\d{5}).*?>(\d{2}).*?>(\d{3}).*?>(\d{3}).*?>(\d{2
+}).*?>(?:[&\w]).*?>(\w+(?:(?:[\s\w|&]+)?)*).*?>\s(\d).*?>(\w*?\d(?:[,
+\d\*]?)*)((?:[\w\d,]?)+).*?>(\w(?:(?:[\w\d-])?)*).*?<\/TR>(<.*)?/i) {
push(@classid, $1);
my $rec = join("", split(/,/, $9));
my $h_fix = join("", split(/,/, $8));
$rec =~ tr/H/h/;
$h_fix =~ tr/H/h/;
push(@classes, $h_fix);
push(@class, parse($h_fix));
push(@location, $10);
my @mi2 = ($2, $3, $4, $5);
push(my @misc_info, \@mi2);
push(@credits, $7);
my $short_name = $6;
$short_name =~ s/&/ AND /;
push(@classname, $short_name);
if ($h_fix =~ /\*$/) {
push (@starperiod, "*");
}
else {
push(@starperiod, "");
}
if ($9) {
push(@classes, $rec);
push(@class, parse($rec));
push(@classid, $1);
push(@location, $10);
push(@misc_info, \@mi2);
push(@credits, $7);
push(@classname, $short_name);
if ($rec =~ /\*$/) {
push (@starperiod, "*");
}
else {
push(@starperiod, "");
}
}
my @erec;
if ($11) {
my @temprec;
@erec = $11 =~ />(.*?)</g;
for (my $z = 0; $z < @erec; $z++) {
my $rectemp;
if ($erec[$z] =~ /^&/) {
}
else {
if ($erec[$z] =~ /\*$/) {
push (@starperiod, "*");
chop($erec[$z]);
$rectemp = $erec[$z];
}
else {
$rectemp = $erec[$z];
}
push(@temprec, $rectemp);
}
}
my $temprec_fix = $temprec[10];
$temprec_fix =~ tr/H/h/;
push(@classid, $classid[-1]);
push(@classes, $temprec_fix);
push(@class, parse($temprec_fix));
push(@location, $temprec[14]);
push(@misc_info, \@mi2);
push(@credits, $credits[-1]);
push(@classname, $short_name);
}
}
}
close ($HTML);
The comments at the top are my workaround, it allowed the script to simply ignore the offending line and continue.
Have fun
-Etan | [reply] [d/l] |
while (<$HTML>)
Is causing problems. The glob is nice in quick and dirty programs
but if the file can not be found there is no error checking. This is
much better for debugging:
open FILE, "<$HTML" or die "Oops opening $HTML, Perl says $!\n";
while (FILE) {
....
}
close FILE;
I would point out that from the security point of view
using a user supplied full file name as you do allows the user to
open any file on your system that your script has read acess to.
Typically you hard code the path and only allow the user to
supply the file name thus constraining them to one dir.
$path = "path/to/my/files";
$HTML =$q->param('file');
open FILE "<$path/$HTML" ....
I suggest changing the while structure to use an open and adding a debugging print to see that
$_ actually contains what you expect within this loop.
cheers
tachyon
s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print
| [reply] [d/l] [select] |