---
title: "\"Can't return outside a subroutine\" - ???"
type: "forum-thread"
url: "https://www.webforum.nu/amne/perl-ruby/19096-can-t-return-outside-a-subroutine"
topic: "Perl & Ruby"
topic_url: "https://www.webforum.nu/amne/perl-ruby"
author: "Hazze"
published: "2000-06-21T21:45:00.000Z"
updated: "2000-07-09T04:15:00.000Z"
replies: 8
views: 394
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/perl-ruby/19096-can-t-return-outside-a-subroutine"
---

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

## #1 — Hazze, 2000-06-21T21:45Z

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?

Permalänk: https://www.webforum.nu/p/19096

## #2 — Csson, 2000-06-21T21:46Z

Testa att byta ut den till enbart:

1;

/Csson

Permalänk: https://www.webforum.nu/p/340865

## #3 — Hazze, 2000-06-21T21:50Z

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:

Permalänk: https://www.webforum.nu/p/340866

## #4 — Hazze, 2000-06-22T09:25Z

Någon som vet?

Permalänk: https://www.webforum.nu/p/340867

## #5 — Robban, 2000-06-22T13:22Z

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. :)

Permalänk: https://www.webforum.nu/p/340868

## #6 — Hazze, 2000-06-22T16:44Z

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

Permalänk: https://www.webforum.nu/p/340869

## #7 — Robban, 2000-06-22T18:21Z

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.

Permalänk: https://www.webforum.nu/p/340870

## #8 — Hazze, 2000-07-08T20:13Z

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?

Permalänk: https://www.webforum.nu/p/340871

## #9 — Robban, 2000-07-09T04:15Z

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.

Permalänk: https://www.webforum.nu/p/340872

---

Tråden på webben: https://www.webforum.nu/amne/perl-ruby/19096-can-t-return-outside-a-subroutine
