Determining the length of an array and a hash
If you are working on Perl, then you will need to find the length or size of an array, hash, and array/hash elements very often.
Meaning of Size or length depends upon for which context you are talking about. Generally it means the number of characters in a string, or the number of elements in an array/hash.
But, if you are using Unicode characters then the number of characters in a string may be different to the number of bytes in the string. So the in-built function length may give different result for different context.
We will see it by using different examples based on different problems:
Example 1. Finding length() of string
To determine the number of characters in an expression use the length() function:
#!/usr/bin/perl use strict; use warnings my $name = "Jassi"; my $size = length($name); print "$size\n";<br /> exit 0;
This example prints the number of characters in the string $name:
5
Example 2. Find the bytes used by string using length()
What, if you want to know the bytes occupied by the string not the characters it holds? This may not matter if you are using ASCII characters but it may, if you are using Unicode characters.
By default the length() function returns the number of characters. You can tell it to return the number of bytes by specifying use bytes; in the program as in this example:
#!/usr/bin/perl use strict; use warnings; my $char = "\x{263a}"; # A smiley face { use bytes; my $byte_size = length($char); print "Bytes: $byte_size\n"; no bytes; } # Character size here my $size = length($char); print "Chars: $size\n"; exit 0;
This outputs:
Bytes: 3
Chars: 1
Note: either use closure or whenever you use “use bytes” try to use “no byets” once you are done
Number of element in an array
Example 3: using array’s last index
In Perl you can determine the last element of an array easily ($#array_name) and add 1 to it to find the number of elements in that array.
#!/usr/bin/perl use strict; use warnings; my @alien_members = qw(jassi Ritesh Ranjan som Santosh); my $size = $#alien_members + 1; print "$size\n"; exit 0;
This gives us:
5
Example 4. Using scalar context of an array
If you assign an array to a scalar variable, it will return the number of elements of that array:
#!/usr/bin/perl use strict; use warnings; my @alien_members = qw(jassi Ritesh Ranjan som Santosh); my $size = @alien_members; print "$size\n"; exit 0;
This gives us:
5
Apart from being confusing to read, this method can lead to some easy mistakes. For example, consider the following program:
#!/usr/bin/perl use strict; use warnings; my @alien_members = qw(Jassi Ritesh Ranjan som Santosh); print "@alien_members\n"; print @alien_members."\n"; exit 0;
What would you expect it to print?
Each array elements to a new line like
Jassi
Ritesh
Ranjan …
Nope it would print
Jassi Ritesh Ranjan som Santosh
5
When double-quotes included, it treats arrays differently. The double-quotes cause Perl to flatten the array by concatenating the values into a string. So behind the stage, something like this happened.
“Join each array element by space and assign it to a scalar variable. So it became a string.” It is something like $size = “@alien_members”; which will differ from $size = @alien_members;
try to print these two statements and see the difference.
But check second print output. Isn’t it strange?
Example 5. Arrays: never use length() to find the number of elements in an array.
You have seen the use of length at Example#1 but still If you try to use the length() function on an array, it won’t give you the desired output.
#!/usr/bin/perl use strict; use warnings; my @alien_members = qw(Jassi Ritesh Ranjan som Santosh); my $size = length(@alien_members); print "$size\n"; exit 0;
The output is not what you thought:
1
This is because the length() function requires a scalar, so the array is forced into scalar context.
And we saw already (example 4) that an array in scalar context already gives us the length. The example above is giving us the length of the length i.e. the length of 5 is 1. Hope it makes sense!
Example 6. Finding the number of elements using scalar() function
No doubt that Example 3 and 4 are correct but they aren’t much clear and friendly to use in our program (readability problem you can say). Perl has the scalar() function which forces the array into scalar context which will give you the length of an array (even hash too):
#!/usr/bin/perl use strict; use warnings; my @alien_members = qw(Jassi Ritesh Ranjan som Santosh); my $size = scalar(@alien_members); print $size\n; exit 0;
This also gives us the correct answer:
5
Example 7. Finding the number of elements in a hash
Sometimes you will also want to have the number of elements of a hash. This is easily done using the keys() function to return the keys as an list, and the scalar() function to return how many keys there are (it is very common question in interviews too):
#!/usr/bin/perl use strict; use warnings; my %alien_members_rank = ( Jassi => 1, Ritesh => 2, Ranjan => 3, Somnath => 5, Santosh => 4 ); my $size = scalar(keys %alien_members_rank); print "$size\n"; exit 0;
The output of this program is:
5
Note: it will not give 10 as you might have thought in context of an array. It can give you no of keys elements and then you can just multiply it by 2 😀
For more details on these functions, see also
perldoc -f length
perldoc -f scalar
perldoc bytes