Saturday, July 23, 2011

joining the lines in file using comma perl

Content of list.txt:

Hi gopal,how are you
Hi james,how are you
Hi,how are you
Hi Thomas,how are you
Hi Manjula,how are you
Hi karthik,how are you

Content of the Perl file:

#!/usr/bin/perl
use File::Copy;
open(FH,";
close(FH);
#For creating the temp file and adding the line no
open(FH1,">list.txt.bak");
$dd=join(',',@ddd); # for joining the lines in the file
$dd =~ s/\n//sg; # for removing the newline character
print FH1 $dd;
close(FH1);
move("list.txt.bak","list.txt") or die "cannot move";
# for moving the temp file to the original files
unlink("list.txt.bak") or die "cannot delete the file";
# for removing the temp file

Content of the list.txt after execution of perl file:

Hi gopal,how are you,Hi james,how are you,Hi,how are you,Hi Thomas,how are you,Hi Manjula,how are you,Hi karthik,how are you

Analysis:
Here i am trying to join all the lines of the file list.txt and separate the lines by comma.To join all the lines i have used join command and replaced "\n" with space using substution in perl.

Adding line no in the files perl

Content of the list.txt:

Hi gopal,how are you
Hi james,how are you
Hi,how are you
Hi Thomas,how are you
Hi Manjula,how are you
Hi karthik,how are you

Content of perl file:

#!/usr/bin/perl
use File::Copy;
open(FH,"<list.txt");

@ddd=<FH> ;
close(FH);
#For creating the temp file and adding the line no
open(FH1,">list.txt.bak");
$size=scalar(@ddd);
for ( $i=0;$i<$size;$i++)
{
$ddd[$i]=~ m/(.*)/;
$dd="$i: "."$1"."\n";
print FH1 $dd;
}
close(FH1);
move("list.txt.bak","list.txt") or die "cannot move";
# for moving the temp file to the original files
unlink("list.txt.bak") or die "cannot delete the file";
# for removing the temp file

Content of the list.txt after execution of the perl file:

0: Hi gopal,how are you
1: Hi james,how are you
2: Hi,how are you
3: Hi Thomas,how are you
4: Hi Manjula,how are you
5: Hi karthik,how are you

Analysis:

Here i have tried add the line no in the file list.txt.For this i have created a tmp file
list.txt.bak and added the line no in those file by using the array index and later replaced the original file list.txt with tmp file:

To match a pattern not having a word inbetween perl

To match a pattern not having a word in between

For example if you want to match a pattern "Hi [person's name],how are you" and person should not be karthik like "Hi karthik,how are you"
and the person's name can be anything else.


Content of list.txt:

Hi gopal,how are you
Hi james,how are you
Hi,how are you
Hi Thomas,how are you
Hi Manjula,how are you
Hi karthik,how are you

Content of perl file:

#!/usr/bin/perl
open(FH,")
{
if ($_=~ m/Hi\s+((?!karthik)\w)*\,how are you/ )
{
print;
}
}

Output:

G:\perl_programs>perl perl_avoidword.pl
Hi gopal,how are you
Hi james,how are you
Hi Thomas,how are you
Hi Manjula,how are you

G:\perl_programs>


Analysis:
Here the important part of it is ((?!karthik)\w)*  which specifies karthik should not be there in between but any other word can be there specified by \w


To extract all occurence of word from string perl

#To extract occurence of word from string
#To extract a occurence of word from a string it is very easy in perl.We need to search the occurence in global way.
#For example to extract all occurence of emailid from a string
Content of the perl file:

#!/usr/bin/perl
$dd='karthik karthik@gmail.com lijo lijo@gmail.com james james@gmail.com thomas thomas@gmail.com';
while ( $dd =~ /\s+(\S*\@\S*.com)\s+/g )
{
print $1."\n";
}


output:

G:\perl_programs>perl perl_occurence.pl
hellokarthik@gmail.com
lijo@gmail.com
james@gmail.com

G:\perl_programs>

Analysis:
Here i have used the pattern /\s+(\S*\@\S*.com)\s+/g  to extract all email-ids from the scalar $dd.Here g signifies globally match all the email -ids from the string.