Había un error en la línea 20 del programa. Había que cambiar un '$' por un '@'. Ya está cambiado y funciona.
El porqué no funciona en el puerto 80 es porque los puertos que están por debajo del 1024
están reservados, así que hay que ser administrador del sistema para poder usarlos.
Si lo ejecuto en mi máquina, como un usuario normal, sale un aviso:
Using bash Syntax Highlighting
$ perl code_38314.pl 80
Serving HTTP on 127.0.0.1 port 80...
bind to 127.0.0.1:80: Permiso denegado at code_38314.pl line 32.
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
pero si lo uso en un puerto superior a 1024, no hay problemas (salvo que ya esté ocupado, claro).
Para que salga el registro de actividad, hay que programarlo. El servidor HTTP es solo eso: sirve contenido, nada más.
El siguiente programa hace de servidor y va registrando la actividad hacia la salida estándar de error:
Using perl Syntax Highlighting
#!/usr/bin/perl
package main;
use v5.14;
use base qw(HTTP::Server::Simple::CGI);
my $port = @ARGV ? int($ARGV[0]) : 8000;
sub handle_request {
my $self = shift;
my $cgi = shift;
# Registro de actividad
my @ahora = (localtime)[3,4,5,2,1];
$ahora[1]++;
$ahora[2]+=1900;
my $ahora = sprintf "[%02d/%02d/%4d %02d:%02d]", @ahora;
my $peticion = '"' . $cgi->request_method() . " " . $cgi->path_info() . '"';
warn join(" ",
$cgi->remote_addr(),
'--',
$ahora,
$peticion,
'200',
$cgi->user_agent(),
),"\n"
;
# Respuesta al cliente
print "HTTP/1.0 200\r\n";
print $cgi->header, $cgi->start_html('Not found'), $cgi->h1('Not found'), $cgi->end_html;
}
# start the server on port 8080
my $pid = main->new($port)->run();
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Arrancando este programa en una terminal, sale:
Using bash Syntax Highlighting
$ perl code_38314.pl
main: You can connect to your server at http://localhost:8000/
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
En otra terminal hago
Using bash Syntax Highlighting
$ telnet 0 8000
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
GET / HTTP/1.1
HTTP/1.0 200
Content-Type: text/html; charset=ISO-8859-1
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Not found</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h1>Not found</h1>
</body>
</html>Connection closed by foreign host.
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
y en la terminal donde se arrancó el servidor sale:
Using text Syntax Highlighting
127.0.0.1 -- [05/02/2015 19:40] "GET /" 200
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
P.D.: Hay otros módulos para crear servidores HTTP en Perl. Por ejemplo, IO::All o Net::Server::HTTP o Mojo::Server::Daemon.