vishi has asked for the wisdom of the Perl Monks concerning the following question:

Hi Gurus,

Yes - I know, what I am trying to do may have been discussed a lot but I couldn't find what I am trying to do.

Here's what I need. I have a list of servers, which I have stored in an array. These servers aren't all that reliable, so I need to make sure I can connect to them before using them in my code. Obviously, I cannot stick to one working server and keep using it, as it's not good load balancing. What I want is something like this:

my connectionStatus = "down"; @listOfServers=("abc","def","lmn","stu","xyz"); while (connectionStatus eq "down") { my $randomServer = $listOfServers[rand @listOfServers]; #Try to connect to $randomServer if ($connect == 1) { connectionStatus = "up"; } else { connectionStatus = "down"; } ## Need to Delete the server in $randomServer from @listOfServers and +pick one randomly and try again ## }

I read about using hashes and grep, but is there something simpler? I dont think I can use splice here as I dont know the index of the random element I just picked...

Any Suggestions?

Replies are listed 'Best First'.
Re: Pick random element from array and delete it
by daxim (Curate) on Jul 17, 2012 at 08:13 UTC
    I dont think I can use splice here as I dont know the index of the random element I just picked
    my $index = rand @listOfServers;
    Problem solved.
Re: Pick random element from array and delete it
by frozenwithjoy (Priest) on Jul 17, 2012 at 08:17 UTC
    You say you "Need to Delete the server in $randomServer from @listOfServers and pick one randomly and try again." Are you sure? what if you empty your array of servers? Is this ok with what you have in mind?

    edit: in case, you don't mind just going through your array once if all the servers are down, take a look at the two examples here:

    #!/usr/bin/env perl use strict; use warnings; use List::Util 'shuffle'; use feature 'say'; my $connectionStatus = "down"; my @listOfServers = ( "abc", "def", "lmn", "stu", "xyz" ); while (@listOfServers) { ##THIS: @listOfServers = shuffle @listOfServers; my $randomServer = shift @listOfServers; ##OR THIS, BUT NOT BOTH: my $randomServer = splice @listOfServers, rand @listOfServers, 1; my $connect = 0; say $randomServer; # replace this with your connection test if ( $connect == 1 ) { $connectionStatus = "up"; last; } }
Re: Pick random element from array and delete it
by Ratazong (Monsignor) on Jul 17, 2012 at 08:16 UTC

    I dont think I can use splice here as I dont know the index of the random element I just picked...

    If you are comfortable with a splice-solution, you may change the way you select your random element: just select a random index (instead of the element itself.)

    HTH, Rata
Re: Pick random element from array and delete it
by Khen1950fx (Canon) on Jul 17, 2012 at 09:25 UTC
    You were on the right track. Try this:
    #!/usr/bin/perl -l use strict; use warnings; my $connectionStatus = "down"; my @listOfServers = qw(abc def lmn stu xyz); foreach my $server ( @listOfServers ) { if ($connectionStatus eq 1) { print "Connection status is: 'up'"; last; } elsif ($connectionStatus ne 1) { $server = $listOfServers[rand @listOfServers]; print "Connection status is: 'down'"; next unless $connectionStatus eq 1; } else { print "This is not going to work ..."; } }
Re: Pick random element from array and delete it
by cheekuperl (Monk) on Jul 17, 2012 at 08:15 UTC
    Do you wish to remove the inactive server in $randomServer from @listOfServers in its entirety so that it does not appear again?