Perl, Perl Tutorials, Tutorials

How chomp and chop function works in Perl

How chomp and chop function works in PerlWhat 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.

#!/usr/bin/perl
use strict;
use warnings;
my $username = <STDIN>;<br />
print "before chomp: $username";
chomp $username; #or chomp($username); or chomp (my $username =<STDIN>); in one line<br />
print "After chomp: $username";

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:

 #!/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";

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:

 #!/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);

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 $/).

#!/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";

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.

#!/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

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:

 #!/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

Output:
[vim]Before chop:
$VAR1 = {
‘first’ => ‘one’,
‘second’ => ‘two’,
‘third’ => ‘three’
};
After chop:
$VAR1 = {
‘first’ => ‘on’,
‘second’ => ‘tw’,
‘third’ => ‘thre’
};
Char: e[/vim]

Note:

  • chop and chomp functions would not work on array/hash reference or array of array/hash reference. So, avoid using this on referential things.
  • Always use parenthesis, if you are using assignment operator while chomping or chopping.
    chomp $value = <STDIN>;  doesn’t work  but chomp($value=<STDIN>); works

Credit: http://perlmeme.org

Comments are closed.