in reply to Array Woes

Quick re-write which tries to straighten out that problem others have described:
#!/usr/bin/perl use strict; use warnings; use IO::Socket::INET; my @host = qw[ 192.168.1.3 192.168.46.2 ]; my $port = 22; foreach (@host) { check($_, $port); } sub check { my ($ip, $port) = @_; my $sock = IO::Socket::INET->new( PeerAddr => $ip, PeerPort => $port, Proto => 'tcp', timeout => 10, ); if ($sock) { print "$ip is listening on port $port\n"; return 1; } print "$ip is NOT listening on port $port.\n"; return; }
Since $sock is either defined or not, there's no real need for a $connected variable. Likewise, in the interest of reducing global variable propagation, it's better to pass $port explicitly.

You also don't need to quote numbers. Not that it's a huge difference, but it looks odd.

Replies are listed 'Best First'.
Re: Re: Using 'and'
by LAI (Hermit) on Dec 12, 2002 at 22:13 UTC

    TMTOWTDI, of course, but I'd prefer to say:

    #!/usr/bin/perl use strict; use warnings; use IO::Socket::INET; my @host = qw[ 192.168.1.3 192.168.46.2 ]; my $port = 22; foreach (@host) { check($_, $port); } sub check { my ($ip, $port) = @_; print ( my $sock = IO::Socket::INET->new( PeerAddr => $ip, PeerPort => $port, Proto => 'tcp', timeout => 10, ) ? "$ip is listening on port $port\n" : "$ip is NOT listening on port $port.\n" ) }

    But then again, I'm a sucker for the ternary operator.


    LAI
    :eof
      I think that edges into obfuscation territory. What about this?
      #!/usr/bin/perl use strict; use warnings; use IO::Socket::INET; my @host = qw[ 192.168.1.3 192.168.46.2 ]; my $port = 22; foreach (@host) { check($_, $port); } sub can_connect { my ($ip, $port) = @_; return ! !IO::Socket::INET->new( PeerAddr => $ip, PeerPort => $port, Proto => 'tcp', timeout => 10, ); } sub check { my ($ip, $port) = @_; my $can_connect = can_connect($ip,$port); print "$ip is "; print "NOT" unless ($can_connect); print " listening on port $port\n"; return $can_connect; } sub check_variation { my $can_connect = can_connect(@_); print "$ip is "; print "NOT" unless ($can_connect); print " listening on port $port\n"; return $can_connect; }
        > I think that edges into obfuscation territory. What about this?
        I call that obfuscation through abundance. :-)

        ...All the world looks like -well- all the world, when your hammer is Perl.
        ---v

        Note: I could have sworn I sent this in yesterday... bah.

        My code edges into obfuscation? How about your double-negative return? ^^;;

        ++ on your modifications, but might I suggest:

        #!/usr/bin/perl use strict; use warnings; use IO::Socket::INET; my @host = qw[ 192.168.0.5 66.100.167.57 ]; my $port = 22; foreach (@host) { check($_, $port); check_variation($_, $port); check_complication($_,$port); } sub can_connect { my ($ip, $port) = @_; return ! !IO::Socket::INET->new( PeerAddr => $ip, PeerPort => $port, Proto => 'tcp', timeout => 10, ); } sub check { my ($ip, $port) = @_; my $can_connect = can_connect($ip,$port); print "$ip is "; print "NOT " unless ($can_connect); print "listening on port $port\n"; return $can_connect; } sub check_variation { # changed this so Strict doesn't complain my $can_connect = can_connect(my ($ip,$port) = @_); print "$ip is "; print "NOT " unless ($can_connect); print "listening on port $port\n"; return $can_connect; } sub check_complication { print "$_[0] is ".($_?"":"NOT ")."listening on port $_[1]\n" and return $_ for can_connect(@_); }

        When I was in high school I had a friend who believed he didn't have bad handwriting because, after all, he could read at least 85% of it. In that vein, "this isn't obfuscation!"


        LAI
        :eof
      > But then again, I'm a sucker for the ternary operator.

      ...I like that. I must confess to the same weakness.

      ...All the world looks like -well- all the world, when your hammer is Perl.
      ---v