Subroutine &keys() and &values() ruturns the keys and values of a hash.

#!/usr/bin/perl

my %hash=("a"=>1,"b"=>2,"c"=>3,);
my @k=keys %hash;
my @v=values %hash;
my $count=keys %hash;

print "@k\n@v\n$count\n";

if(%hash){
    print "That's not a empty hash\n";
}

$ ./key_value.pl
c a b
3 1 2
3
That's not a empty hash

Although key list and value list are not ordered as we think, they order the same way.
Between keys() and values() are called, don't change the hash.

&each() returns the key_value pairs of a hash.

while(($key,$value)=each %hash){
    print "$key => $value\n";
}

The only use of each() in practice is in while() loop.
Note while() is a scalar context, when the condition is a list, take the number of elements of list for true/false judgment.
If more than 0 element it is true, 0 element is false.

We can use foreach to get an ordered key_value pair.

foreach $key (sort keys %hash){
    print "$key => $hash{$key}\n";
}

&exists() can judge if a key exists in a hash or not.
If exists then true, otherwise false.

if(exists $hash{"a"}){
    print "There is a value for a\n";
}else{
    print "There is no value for a\n";
}

&delete() deletes a pair of value and key from hash.
It is not the same as to give undef to a value, with value undef the key_value still exists.

The value of hash can be inserted in quotes like value of scalar.

#!/usr/bin/perl

my %books=(fred=>3,wilma=>1,barney=>0,pebbles=>undef,);

foreach $person(sort keys %books){
    if($books{$person}){
        print "$person has $books{$person} items\n";
    }
}

%ENV stores the environment parameters of the system, we can get the envs:

foreach $env(sort keys %ENV){
    print "The '$env' is '$ENV{$env}'\n";
}

Every value we exports in shell will be added to %ENV.

$ export aa=AAAAAAAA    # set in shell
print "The name of 'aa' is '$ENV{aa}'\n";

The name of 'aa' is 'AAAAAAAAA'

Execsices:

1. Get names of some users, print their given names.

#!/usr/bin/perl

my %names=(
    fred => "flintstone",
    barney => "rubble",
    wilma => "flintstone",
    );

foreach $surname(sort keys %names){
    print "The name of $surname is $names{$surname}\n";
}
##################################

2. Input some names, each line one name, Print the times of each name appears.

#!/usr/bin/perl

while(<>){
    chomp;
    $count{$_}++;
}

foreach $name(sort keys %count){
    if($count{$name}){
        print "$name appears $count{$name} times\n";
    }
}
##################################

3. Print %ENV each line left align, use length() to get the proper length to align.

#!/usr/bin/perl

my $longest=0;
foreach(sort keys %ENV){
    $longest = length($_) if $longest < length($_);
}

foreach $env(sort keys %ENV){
    printf "%-${longest}s: %s\n", $env,$ENV{$env};
}