webForumDet fria alternativet

"Can't return outside a subroutine" - ???

8 svar · 384 visningar · startad av Hazze

HazzeMedlem sedan jan. 20002 453 inlägg
#1

Hejsan!
Jag behöver lite hjälp med detta:
Jag har ett script som ser ut så här:

#!/usr/local/bin/perl

sub main { 
open(FILE, $file_id) or die("Error! Can't open $file_id");
@lines = <FILE>;
close(FILE);

print "Content-type: text/html\n\n";

$i=0;
$flag=0;
foreach $line (@lines) {
	($id, @temp) = split(/\|/, $line);

	$id =~ s/\s//g; # Remove spaces in the $id
	if ($ENV{'QUERY_STRING'} eq $id) {
		$index = $i;
		$flag = 1;
		@paths = @temp;
		}
	$i++;
	}

if ($flag == 0) {
	&Invalid_id; # ID not found in database
	}
else {
	&Show_page; # Show download page
	}
exit;
}

sub Invalid_id {
#######################################                        #
# Edit the following if you want to have a different error page#
#                        #######################################
print <<END_OF_HTML;
<html>
<head>
<title>Invalid ID</title>
</head>

<body bgcolor="#353E8D" text="#ffffff">

<font face="Verdana" size=4><b>Invalid ID</b></font>
<hr size="1" width="90%" align="left">
<p>
<font face="Verdana" size=2>
ID not found in database
</font>
</body>
</html>
END_OF_HTML
}

sub Show_page {
	open(DESC, $file_desc) or die("Error! Can't open $file_desc");
	@lines = <DESC>;
	close(DESC);

	($title, $desc) = split(/\|/, $lines[$index]);
	
	open(INFO, $file_info) or die("Error! Can't open $file_info");
	@lines = <INFO>;
	close(INFO);
	
	$info = $lines[$index];

	$i=0;
	$links = "";
	foreach $path (@paths) {
		chomp($path);
	
		if ($path !~ /^(http\:\/\/|ftp\:\/\/)/i) {
			$temp = $baseurl;
		 	$temp =~ s/^(http\:\/\/|ftp\:\/\/)(.+)/$2/;
			$server = $temp;
			
			$link = $baseurl.$path;
			}
		else {
			$temp = $path;
			$temp =~ s/^(http\:\/\/|ftp\:\/\/)(.+)(\/.*)/\2/;
			($server, $null) = split(/\//, $temp);
			
			$link = $path;
			}
		
		$temp = $link_html;
		$temp =~ s/\[\%\%LINK\%\%\]/$link/gi;
		$temp =~ s/\[\%\%SERVER\%\%\]/$server/gi;
		$links = $links.$temp;
		$i++;
		}

	open(HTML, $html_temp) or die("Error! Can't open $html_temp");
	@lines = <HTML>;
	close(HTML);

	foreach $line (@lines) {
		if ($line =~ /\[\%\%TITLE\%\%\]/i) {
			$line =~ s/\[\%\%TITLE\%\%\]/$title/gi;
			}
		if ($line =~ /\[\%\%DESC\%\%\]/i) {
			$line =~ s/\[\%\%DESC\%\%\]/$desc/gi;
			}
		if ($line =~ /\[\%\%FILESIZE\%\%\]/i) {
			if ($paths[0] !~ /^(http\:\/\/|ftp\:\/\/)/i) {
				$filename = $basedir.$paths[0];
				chomp($filename);
				@filestat = stat($filename);
				$line =~ s/\[\%\%FILESIZE\%\%\]/$filestat[7]/gi;
				}
			else {
				$line =~ s/\[\%\%FILESIZE\%\%\]//gi;
				}
			}
		if ($line =~ /\[\%\%LINKS\%\%\]/i) {
			$line =~ s/\[\%\%LINKS\%\%\]/$links/gi;
			}
		if ($line =~ /\[\%\%INFO\%\%\]/i) {
			$line =~ s/\[\%\%INFO\%\%\]/$info/gi;
			}
			
		print $line
		}

}

return 1;

Jag får sedan felmeddelandet:
Can't return outside a subroutine at d:\clients\sks.nu\scripts\id\DLTempex.pl line 145.

Rad 145 är alltså den sista raden i scriptet. Nån som har någon aning om vad som är fel på sista raden?

------------------
//
<title>Hazze</title>

CssonMedlem sedan feb. 2000438 inlägg
#2

Testa att byta ut den till enbart:

1;

/Csson

HazzeMedlem sedan jan. 20002 453 inlägg
#3

Det var nog det snabbaste svaret någonsin ;)
Tyvärr fungerade det inte men jag fick ett annat felmeddelande nämligen:
The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:

------------------
//
<title>Hazze</title>

HazzeMedlem sedan jan. 20002 453 inlägg
#4

Någon som vet?

------------------
//
<title>Hazze</title>

RobbanMedlem sedan dec. 19992 555 inlägg
#5

Antingen är det en vilsen C-programmerare som har skrivit det här programmet, eller så är det frågan om en modul som är avsedd att inkluderas med use eller require, och inte är tänkt att köras som ett eget program. :)

Du har ju bara en massa subrutiner, följt av en return 1;. Perl är inte som C där funktionen main körs automatiskt, utan för Perl är din subrutinen main som vilken annan subrutin som helst, som måste anropas för att köras. Vad som händer när du kör scriptet är alltså att alla subrutiner definieras, och sedan hoppar programmet till sista raden försöker köra return 1; (som alltså inte går, eftersom return bara kan förekomma i en subrutin), eller 1; (efter din ändring). Det senare är syntaktiskt korrekt, men ger inte så mycket utskrift. Och det är därför webservern klagar. :)

------------------
Robban < robban@lipogram.com >

HazzeMedlem sedan jan. 20002 453 inlägg
#6

Du menar alltså att jag ska strunta i detta scriptet?

------------------
//
<title>Hazze</title>

RobbanMedlem sedan dec. 19992 555 inlägg
#7

Du kan ju prova med att ta bort return 1; på slutet, och aldeles efter första raden lägga till:

&main;

Då bör scriptet köras i.a.f. Sedan kan det ju vara andra saker som ger nya felmeddelanden. Om det nu inte är avsett att köras som eget script menar jag.

------------------
Robban < robban@lipogram.com >

[Redigerat av Robban den 22 jun 2000]

HazzeMedlem sedan jan. 20002 453 inlägg
#8

Måste faktiskt kämpa vidare med detta scriptet eftersom det verkar väldigt bra.

Jag har nu fått ett nytt felmeddelande:

 CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:

Error! Can't open  at /clients/sks.nu/scripts/id/DLTempex.pl line 19.

Det borde väl inte vara helt omöjligt att lösa?

------------------
//
<title>Hazze</title>

RobbanMedlem sedan dec. 19992 555 inlägg
#9

Beror på att scriptet i följande rad försöker öppna en fil, men misslyckas.

open(FILE, $file_id) or die("Error! Can't open $file_id");

Vad jag kan se är inte $file_id satt innan denna filöppning äger rum. Verkar, som sagt, som om detta inte är ett komplett script, utan om en modul (bibliotek) som är avsedd att inkuderas i ett script med use eller require. Jag är tämligen säker på att det fattas delar till det.

------------------
Robban < robban@lipogram.com >

137 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)