in reply to Re: Simple hash assignment...or is it?
in thread Simple hash assignment...or is it?

The Dumper output shows me the same thing as my own print statements: that there's some difference between the interface names I'm passing into the foreach block, and what's getting set as hash keys. It's a very confusing problem:
$VAR1 = (                 
          'en0',          
          'en1'           
        );                
en0: ent0                 
ent0                      
en1: ent1                 
ent1                      
$VAR1 = {                 
          'en0' => 'ent0',
          'en1' => 'ent1' 
        };                
(empty line)
(empty line)

because, as you can see, the hash keys are the same string as the members of the array.

  • Comment on Re: Re: Simple hash assignment...or is it?

Replies are listed 'Best First'.
Re: Re: Re: Simple hash assignment...or is it?
by Roger (Parson) on Nov 22, 2003 at 01:14 UTC
    I have rewritten your code to make it a bit Perl like. The following code is equivalent to your code -
    use strict; use Data::Dumper; my $network_ifs = `netstat -i | grep -Ev "lo|sit|link|Name" | cut -f1 +-d" " | uniq | sort -n`; my @tcp_utilization_metrics = split '\n', $network_ifs; my %tcp_utilization_adapter_names; foreach my $network_if (@tcp_utilization_metrics) { next if ! $network_if; # ignore empty lines if any my $if_name = $network_if; if ($network_if =~ /en/) { substr($network_if, 2, 0) = "t"; # insert 't' } elsif ($network_if =~ /tr/) { substr($network_if, 1, 2) = "ok"; # replace 'ok' } elsif ($network_if =~ /at/) { substr($network_if, 2, 0) = "m"; # insert 'm' } # insert hash entries $tcp_utilization_adapter_names{$if_name} = $network_if; } # investigate the hash foreach (keys %tcp_utilization_adapter_names) { print "$tcp_utilization_adapter_names{$_}\n"; }
    Perhaps you could tell us what is your expected hash output. I highly suspect that you want the following instead in your code (swap the key-value in the hash) -
    # insert hash entries $tcp_utilization_adapter_names{$network_if} = $if_name;

      Thanks...I'm sure you can tell I come from a C++/Java upbringing. The hash that Dumper displays is exactly what I want the hash to look like. The problem is that the keys (in @tcp_utilization_metrics) which are used to create the hash, don't seem to work to retrieve values from the hash. That's what has me so confused: both the hash and the array LOOK right, but something I don't know about ISN'T right.

        To print the values in a hash, use the keys keyword.
        my %hash = ( 'a' => 1, 'b' => 2, 'c' => 3); foreach (keys %hash) { print "$_ => $hash{$_}\n"; }
        Cheers. :-)

      mpeppler figured it out for me...see below. Thanks for your help!