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};
}
|