Bienvenido a los foros de Perl en Español, academico69.
Recuerda que lo que estás sacando hacia la página web es (o debe ser) código HTML, así que los retornos de carro "\n" no son suficientes para indicarle al navegador web que debe hacer saltos de línea.
Debes cambiar los "\n" por '<br>', que son las marcas HTML que indican la ruptura de línea (salto de línea).
Using perl Syntax Highlighting
#!/usr/bin/perl
use Shell;
print "Content-type: text/html\n\n";
my $ping;
$ping = ping('-c5', 'www.google.com'); # ¡Ping!
$ping =~ s/\n/<br>/g; # sustituimos todos los "\n" por '<br>'
print $ping;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Entonces sale algo como esto:
PING www-cctld.l.google.com (173.194.34.248) 56(84) bytes of data.<br>64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=1 ttl=56 time=470 ms<br>64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=2 ttl=56 time=490 ms<br>64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=3 ttl=56 time=458 ms<br>64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=4 ttl=56 time=520 ms<br>64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=5 ttl=56 time=465 ms<br><br>--- www-cctld.l.google.com ping statistics ---<br>5 packets transmitted, 5 received, 0% packet loss, time 4000ms<br>rtt min/avg/max/mdev = 458.043/481.198/520.888/22.612 ms<br>A esto le faltan cosas, y además, quedaría mejor si la salida quedara formateada, aunque no se viera directamente en el navegador.
Mejor así:
Using perl Syntax Highlighting
#!/usr/bin/perl
use Shell;
print "Content-type: text/html\n\n";
print "<html>\n"; # inicio de código HTML
print "<body>\n";
my $ping;
$ping = ping('-c5', 'www.google.com'); # ¡Ping!
$ping =~ s/\n/<br>\n/g; # sustituimos todos los "\n" por "<br>\n"
print $ping;
print "</body>\n"; # fin de código HTML
print "</html>\n";
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Aquí le hemos añadido marcas HTML al principio y al final, y retornos de carro después de los '<br>'. La salida es así:
Using html4strict Syntax Highlighting
<html>
<body>
PING www-cctld.l.google.com (173.194.34.248) 56(84) bytes of data.<br>
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=1 ttl=56 time=524 ms<br>
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=2 ttl=56 time=533 ms<br>
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=3 ttl=56 time=459 ms<br>
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=4 ttl=56 time=419 ms<br>
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=5 ttl=56 time=500 ms<br>
<br>
--- www-cctld.l.google.com ping statistics ---<br>
5 packets transmitted, 5 received, 0% packet loss, time 4004ms<br>
rtt min/avg/max/mdev = 419.477/487.511/533.800/42.606 ms<br>
</body>
</html>
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
que ya tiene aspecto de página web...
Otra opción, en lugar de hacer la sustitución, es la de hacer la presentación de la salida de ping dentro de unas marcas <pre>, indicando que se trata de un texto que ya está
preformateado, por lo que el navegador lo mostrará -generalmente- en fuente monoespaciada y respetando los avances de línea:
Using perl Syntax Highlighting
#!/usr/bin/perl
use Shell;
print "Content-type: text/html\n\n";
print "<html>\n"; # inicio de código HTML
print "<body>\n";
my $ping = ping('-c5', 'www.google.com'); # ¡Ping!
$ping = "<pre>$ping</pre>"; # metemos al $ping dentro de las marcas <pre>
print $ping;
print "</body>\n"; # fin de código HTML
print "</html>\n";
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Y ya queda una salida más limpia:
Using html4strict Syntax Highlighting
<html>
<body>
<pre>PING www-cctld.l.google.com (173.194.34.248) 56(84) bytes of data.
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=1 ttl=56 time=524 ms
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=2 ttl=56 time=533 ms
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=3 ttl=56 time=459 ms
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=4 ttl=56 time=419 ms
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=5 ttl=56 time=500 ms
--- www-cctld.l.google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 419.477/487.511/533.800/42.606 ms
</pre></body>
</html>
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Finalmente... está la opción de usar el módulo CGI de Perl, que abrevia buena parte del trabajo:
Using perl Syntax Highlighting
#!/usr/bin/perl
use CGI ':standard';
use Shell;
my $ping = ping('-c5', 'www.google.com'); # ¡Ping!
print header(); # Cabecera HTTP
print start_html('Resultados del ping'); # inicio de página HTML, con su título
print pre($ping); # marcas '<pre>'
print end_html(); # fin de código HTML
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Y ya sale una respuesta completa:
Using html4strict Syntax Highlighting
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>Resultado del ping</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<pre>PING www-cctld.l.google.com (173.194.34.248) 56(84) bytes of data.
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=1 ttl=56 time=341 ms
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=2 ttl=56 time=394 ms
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=3 ttl=56 time=276 ms
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=4 ttl=56 time=289 ms
64 bytes from mad01s09-in-f24.1e100.net (173.194.34.248): icmp_seq=5 ttl=56 time=301 ms
--- www-cctld.l.google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3998ms
rtt min/avg/max/mdev = 276.630/320.739/394.159/42.664 ms
</pre>
</body>
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Si quieres hacer pruebas, incluso lo puedes ejecutar desde la línea de comandos:
perl -MCGI=:standard -MShell -E '$ping = ping("-c5", "www.google.es"); print header(), start_html("Resultado del ping"), pre($ping), end_html();'