#!/usr/bin/perl -w
#
# demo_pl
#
# A "self-extracting archive" for some demo scripts.
#
# hello - the classic
# helloyou - advanced classic
# httpget1 - simple sockets
# httpget2 - simple sockets done complex
# md5 - core extension
# time - system call
# times - more system calls
#
use
strict;
unless
(
@ARGV
&&
$ARGV
[0] =~ /^(?:list|extract|cleanup)$/) {
die
"$0: Usage: $0 [list|extract|cleanup]\n"
;
}
my
$action
=
shift
;
my
$list
=
$action
eq
'list'
;
my
$extract
=
$action
eq
'extract'
;
my
$cleanup
=
$action
eq
'cleanup'
;
my
$fh
;
while
(<DATA>) {
if
(/^-- (.+\.pl)$/) {
if
(
$cleanup
) {
"Deleting $1\n"
;
unlink
$1 or
warn
"$0: $1: $!\n"
;
}
elsif
(
$extract
) {
defined
$fh
&&
close
(
$fh
);
open
(
$fh
,
">$1"
) or
die
"$0: '$1': $!\n"
;
"Extracting $1\n"
;
}
elsif
(
$list
) {
"$1\n"
;
}
}
else
{
$fh
$_
if
$extract
;
}
}
defined
$fh
&&
close
(
$fh
);
exit
(0);
__END__
-- hello.pl
print "hello world!\n";
-- helloyou.pl
print "What is your name?\n";
chomp(my $name = <STDIN>);
print "Hello, $name!\n";
print "Amazing fact #1:\n";
printf "Your name has\n%d character%s!\n",
length($name), length($name) == 1 ? "" : "s";
print "Amazing fact #2:\n";
printf "Your name is\n%s backwards!\n", scalar reverse $name;
-- httpget1.pl
print "(Using plain sockets)\n";
use Socket;
print "Host? ";
my $host = <STDIN>;
chomp($host);
$host = 'www.nokia.com' unless length $host;
my $port = 80;
my $iaddr = inet_aton($host) || die "no host: $host";
my $paddr = sockaddr_in($port, $iaddr);
my $proto = getprotobyname("tcp");
socket(S, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
connect(S, $paddr) || die "connect: $!";
print "$host:$port:\nConnected.\n";
select(S); $| = 1; select(STDOUT);
print S "GET / HTTP/1.0\012\012" || die "GET /: $!";
my @line;
print "Receiving...\n";
while (my $line = <S>) {
push @line, $line;
}
close(S) || die "close: $!";
printf "Got %d lines.\n", scalar @line;
-- httpget2.pl
use IO::Socket;
print "(Using IO::Socket)\n";
print "Host? ";
my $host = <STDIN>;
chomp($host);
$host = 'www.nokia.com' unless length $host;
my $port = 80;
my $remote =
IO::Socket::INET->new(Proto => "tcp",
PeerAddr => $host,
PeerPort => $port);
print "$host:$port:\nConnected.\n";
select($remote); $| = 1; select(STDOUT);
print $remote "GET / HTTP/1.0\012\012" || die "GET /: $!";
my @line;
print "Receiving...\n";
while (my $line = <$remote>) {
push @line, $line;
}
close($remote) || die "close: $!";
printf "Got %d lines.\n", scalar @line;
-- md5.pl
use Digest::MD5 'md5_hex';
print "(Using Digest::MD5)\nMD5 of 'Perl' is:\n";
print md5_hex('Perl'), "\n";
-- time.pl
print "Running in $^O\n";
print scalar localtime, "\n";
-- times.pl
use Time::HiRes qw(time sleep);
print CORE::time(), "\n";
print "Hires\n";
print time(), "\n";
print "Sleep 1.5 s...\n";
sleep(1.5);
print time(), "\n";
print "To one million...\n";
my $t0 = time();
print $t0, "\n";
print "Cpu ", scalar times(), "\n";
for(my $i = 0; $i < 1e6; $i++) {}
print "Cpu ", scalar times(), "\n";
my $t1 = time();
print $t1, "\n";
print "Wall ", $t1 - $t0, "\n";