I noted from your original posting that you quoted from a URL which is controversial
in that the Perl-related books from O'Reilly are actually pirated copies. This was pointed out by one of the
subscribers to this list in a recent thread.
Alfred,
Michael Gale wrote:
Hello,
I fixed it, the string would initially contain special characters such as % signs. I strip out all the characters before the check, instead of after.
Michael.
On Wed, 2005-03-30 at 16:19 -0700, Michael Gale wrote:
Hello,
I tried your example, it worked as expected, here is the entire code:
--snip--
my @servers; my $each_server; my $each_host; my %seen = ( );
print "<h2>List of systems being performance monitored</h2>\n"; print "Please select a host\n";
opendir(RRDDIR,"/home/nagios/network-monitor/nagiosgraph/rrd") || die "Can't find servers"; @servers = readdir(RRDDIR); closedir RRDDIR;
sub show_host{ my($each_host) = @_; my $thost; $each_host =~ /(.*)_(.*)_/; $thost = $1; $thost =~ s/\%2D/ /g; #print "$thost<BR>\n"; print "<option value=\"$thost\">$thost\n"; }
print "<form name=serverlist action=layout.cgi method=GET>\n"; print "<select name=server size=10>\n";
foreach my $each_server(@servers) { unless ($seen{$each_server}) { $seen{$each_server} = 1; show_host($each_server); } }
print "</select>\n";
print "</form>\n";
--snip--
On Wed, 2005-03-30 at 18:12 -0500, Offer Kaye wrote:
On Wed, 30 Mar 2005 15:53:25 -0700, Michael Gale wrote:
But it is not working as expected, even if the array has the first three entries the same, the function "show_host" gets called three time ?
foreach $each_server(@servers) { unless ($seen{$each_server}) { $seen{$each_server} = 1; show_host($each_server); } }
The code is okay. Try just the following in a standalone file: ########## begin code use strict; use warnings; my @servers = qw/a a a b c d/; my %seen; foreach my $each_server(@servers) { unless ($seen{$each_server}) { $seen{$each_server} = 1; show_host($each_server); } } sub show_host { print "$_[0]\n"; } ########## end code If you run it, you will see it just prints "a" once, not 3 times. So the problem is in some other code you are not showing us. -- Offer Kaye