CSCI 4230
Internet Applicaiton Development
Fall 2000
Suugested Solution to Homework #3

(1 and 2)    For example:

use strict;
#
# h3q1.pl
# Bun Yue   August 16, 2000
#

testReverseList();
exit 0;

#
# Deep reversal of elements in a list.
#
sub reverseList {
    my @in = @_;
    my @result = ();
    foreach my $element (@in) {
        if (ref $element eq "ARRAY") {
            my @temp = reverseList(@$element);
            unshift @result, \@temp;
        }
        else {
            unshift @result, $element;
    }
    }
    @result;
}

#
# Return a string represent a list that may contain
# element of array reference and scalar.
#
sub deepListContents {
    "(" . deepListElementContents(@_) . ")";
}

sub deepListElementContents {
    my $result = "";
    my @in = @_;
    foreach my $element (@in) {
        if (ref($element) eq "ARRAY") {
            $result .= "[" . deepListElementContents(@$element) . "], ";
        }
        else {
            $result .= "$element, ";
        }
    }
    $result =~ s/, $//;
    $result;
}

sub testReverseList {
    my @in = (1, 2, ["a", "b", [], [3, 4, [6]], "c"], 45);
    print "Original list:\n";
    print deepListContents(@in);
    print "\nReversed list:\n";
    print deepListContents(reverseList(@in));

}

(3)    For example,

use strict;
use LWP::Simple;
use LWP::UserAgent;
use URI;
use HTML::LinkExtor;

#
# h3q3.pl
# Bun Yue   August 16, 2000
#

@ARGV < 1 && die "Usage: h2q3.pl url\n";

# Get URL.
my $url = $ARGV[0];   # Input url

my $urlContents = "";  # Contents of input url.
my $baseDNS = "";   # Base DNS of the url.
$urlContents = get($url) || die "Error: invalid URL.\n";

#   Get base directory.
$url =~ /http:\/\/([^\/]*)/;
my $baseDNS = $1;

#    Parse a links.
my @links = ();
my $parser = HTML::LinkExtor->new;
$parser->parse($urlContents);
my @parsedTags = $parser->links();
foreach (@parsedTags) {
   my ($tag, %attr) = @$_;
   push(@links, $attr{'href'}) if $tag eq 'a';
}

#   Process links.
my %numLinks = ();
foreach (@links) {
   next if (/^mailto:/);
   if (/^http:/) {
     /http:\/\/([^\/]*)/;
     $numLinks{$1}++;
   }
   else {
      $numLinks{$baseDNS}++;
   }
}

# Print result:
print "For the page in the URL $url:\n";
print "the following domains are accessed:\n\n";

foreach (sort keys %numLinks) {
    print "$_: $numLinks{$_}.\n";
}
exit 0;