[WpProQuiz 1]
[WpProQuiz_toplist 1]
Learning through sharing
[WpProQuiz 1]
[WpProQuiz_toplist 1]
What is chomp and chop?
chomp()
The chomp() function will remove (usually) any new line character from the end of a string. The reason we say usually is that it actually removes any character that matches the current value of $/ (the input record separator), and $/ defaults to a new line. It returns the total number of characters removed from all its arguments and If VARIABLE is omitted, it chomps $_
So, if $/ =”\t” then chomp would remove every tab instead of new line.
For more information on the $/ variable, try perldoc perlvar and see the entry for $/ and perldoc -f chomp
Note: if chomp doesn’t behave as it should by default, hint is to check record separator ($/)
chop()
Sometimes you will find you want to unconditionally remove the last character from a string. While you can easily do this with regular expressions, chop is more efficient. Check perldoc -f chop
The chop() function will remove the last character of a string (or group of strings) regardless of what that character is and return the last character chopped. In case of array it return the last character chopped of the last element of the array. Note, if you want to easily remove newlines or line separators see the chomp().
As chop return the last character chopped of the string , if you want it's reverse i.e. return all characters except the last from the string you could use substr($string, 0, -1)
Chomp and chop, both functions can be applied on strings,array,hash. We would see it by three examples for each functions.
Example 1. Chomping a string
Most often you will use chomp() when reading data from a file or from a user. When reading user input from the standard input stream (STDIN) for instance, you get a newline character with each line of data. chomp() is really useful in this case because you do not need to write a regular expression and you do not need to worry about it removing needed characters.
When running the example below, using the enter key on a line by itself will exit the program.
[perl]#!/usr/bin/perl
use strict;
use warnings;
my $username = <STDIN>;
print "before chomp: $username";
chomp $username; #or chomp($username); or chomp (my $username =<STDIN>); in one line
print "After chomp: $username";[/perl]
Output:
[vim][Sanjeev@Alien Coders]$ perl chomp_examples.pl
Alien Coders
before chomp: Alien Coders
After chomp: Alien Coders[Sanjeev@Alien Coders]$[/vim]
First print got printed with new line which you entered while typing. Yes, it took new line (pressed enter) also as user input. Second line removed that new line, so second print is displayed along with shell on the same line.
Example 2. Chomping an array
If you chomp an array, it will remove newline from the end of every element in the array:
[perl] #!/usr/bin/perl
use strict;
use warnings;
my @array = ("sanjeev\n", "Jassi", "AlienCoders\n");
print "Before chomp:\n";
print "@array\n";
chomp(@array);
print "After chomp:\n";
print "@array\n";[/perl]
Output:
[vim]Before chomp:
sanjeev
Jassi AlienCoders
After chomp:
sanjeev Jassi AlienCoders[/vim]
As you can see, the newlines have been removed from "sanjeev" and "AlienCoders", but no characters have been removed from "jassi".
Example 3. Chomping a hash
If you pass a hash into chomp() function, it will remove newlines from every value (not key) of the hash. Remember key is always unique and string (internally). So, if you add new line in key then use that new line char also while using that key. Better to avoid such nasty thing:
[perl] #!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %hash = (
'first' => "one\n",
'second' => "two\n",
'third' => "three\n",
);
print "before chomp:\n";
print Dumper(\%hash);
chomp(%hash);
print "after chomp:\n";
print Dumper(\%hash);[/perl]
Output:
[vim]before chomp:
$VAR1 = {
'first' => 'one
',
'second' => 'two
',
'third' => 'three
'
};
after chomp:
$VAR1 = {
'first' => 'one',
'second' => 'two',
'third' => 'three'
};[/vim]
It clearly shows that how new line is effective before chomp and it looks nice after chomp.
Example 4. Chopping a string
The chop() function removes and returns the last character from the given string whatever it is. So don’t do any mistake by assuming that it removed new line from the user input with its first use. When you will use it second time it will again remove one more character from user input but chomp only and only removes new line (or whatever is stored in $/).
[perl]#!/usr/bin/perl
use strict;
use warnings;
my $string = 'Perl';
my $char = chop($string); #to return the chopped character in a variable
print "String: $string\n";
print "Char: $char\n";[/perl]
Output:
[vim]String: Per
Char: l[/vim]
Example 5. Chopping an array
If you pass the chop() function to an array, it will remove the last character from every element in the array.
[perl]#!/usr/bin/perl
use strict;
use warnings;
my @arr = ('Jassi', 'Sanjeev', 'Alien Coders');
my $last_char = chop(@arr);
print "@arr\n";
print "Last Char: $last_char\n"; #it will store last character of last element in the array[/perl]
Output:
[vim]Jass Sanjee Alien Coder
Last Char: s[/vim]
Example 6. Chopping a hash
If you pass a hash into chop() function , it will remove the last character from the values (not the keys) in the hash. For example:
[perl] #!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %hash = (
first => 'one',
second => 'two',
third => 'three',
);
print “Before chop:\n”;
print Dumper \%hash;
my $chr = chop(%hash);
print “After chop: \n”;
print Dumper(\%hash);
print "Char: $chr\n"; #it always have last character of last value in hash[/perl]
Output:
[vim]Before chop:
$VAR1 = {
'first' => 'one',
'second' => 'two',
'third' => 'three'
};
After chop:
$VAR1 = {
'first' => 'on',
'second' => 'tw',
'third' => 'thre'
};
Char: e[/vim]
Note:
Credit: http://perlmeme.org
So we will use File::Copy module and will call copy() function to copy the file and move() function to move the files.
Ok then, How it works?
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:
[perl]#!/usr/bin/perl
use strict;
use warnings;
my $name = 'Jassi';
my $size = length($name);
print "$size\n";
exit 0;[/perl]
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:
[perl] #!/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;[/perl]
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.
[perl] #!/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;[/perl]
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:
[perl] #!/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;[/perl]
This gives us:
5
Apart from being confusing to read, this method can lead to some easy mistakes. For example, consider the following program:
[perl] #!/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;[/perl]
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.
[perl]#!/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;[/perl]
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):
[perl] #!/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;[/perl]
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):
[perl] #!/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;[/perl]
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
Subscribe now to keep reading and get access to the full archive.