Angus am Freitag, 3. Februar 2006 10.13:
> Joe,
>
> Thank you for taking the time to explain this bit of code.  I have spent
> some time trying to understand the ternary operator (?:) this evening and I
> think it is making more sense.  In the past I have seen this operator and
> moved on in favor of using if/then/else statements but I can see how in
> this example it is much simpler to evaluate the EXPR with a ternary than to
> use code blocks.  I can now see mostly how this expression works in your
> example.  I see that the first expression says $actual{$_} equal
> $register{$_} if this is true then $_ equals the hostname. 

gotcha :-)


> But, if this 
> statement is false then I see that we dereference the $_ values in both
> Arrays.

Not quite shure what you mean here

> When I do run this code though it seems to print out the memory address for
> the hostname reference which I think means it is not being dereferenced
> correctly but I don't see how it differs form the else part of the print
> statement
>
> ARRAY(0x816e00c) differs:actual 164.72.119.175 <-> register 164.72.119.179
> ARRAY(0x816e03c) differs:actual 164.72.123.43 <-> register 164.72.21.43
> host3 is ok
> ARRAY(0x819bed4) differs:actual 164.72.98.89 <-> register 164.72.8.89
> host5 is ok

Hm, indeed (now after testing) - it is my fault, but it motivated you to go 
into the details :-)

I posted a correction to my first version, and I did not consider all side 
effects of the faulty first version.
Further, my code misses an information: The host name in the case the two IPs 
differ.

I'll post below the code in the first version (with the mentioned missing 
info), it's runnable now :-)

Then, some snippets for a modification follows to get the host name in the 
result also in the case of differing IPs.

=== BEGIN first version ===
#!/usr/bin/perl

use strict;
use warnings;

my %actual = (
"host1" => "164.72.119.175",
"host2" => "164.72.123.43",
"host3" => "164.72.45.98",
);

my %register = (
"host1" => "164.72.119.179",
"host2" => "164.72.21.43",
"host3" => "164.72.45.98",
);

my @res = map {
   ( $actual{$_} eq $register{$_} )
   ? $_
   : [ $actual{$_}, $register{$_} ] ### (A) ###
} sort keys %register;

foreach my $e (@res) {
  if (!ref($e)) {
    print "$e is ok\n";
  }
  else {
    # corrected the following print, since host name is not in @res in 
    # this case ### (B) ###
    print "Differing IPs (host info missing): ",
           "actual @{[$e->[0]]} <-> register @{[$e->[1]]}\n";
  }
}
=== END first version ===

Ok, now to get the host name into the result, there are several possibilities.
The easiest way is to modify the (A) and (B) lines above like:

: [ $_, $actual{$_}, $register{$_} ] # host name, IP 1, IP 2

print "host @{[$e->[0]]} differs: ",
        "actual @{[$e->[1]]} <-> register @{[$e->[2]]}\n";
        # note that the indexes have changed.


> I still have some ways to go with really understanding this but I am
> closer.

Yes, I can see that! Good luck!

> P.s. Your English is probably better than mine; I wouldn't know it wasn't
> your first language if you didn't mention it.

Thanks :-)
(learning english is the main reason for me to be on the list)

joe

[whole history snipped away]

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to