Perl script


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Perl script
# 8  
Old 12-22-2011
oh yeah i dint think of that... well if it goes negative i need to include both month reduced by 1 but then i need to consider all the months in an year since the number of days varies.. :-) thanks for finding the bug willl rectify it shortly
# 9  
Old 12-22-2011
awesome

Quote:
Originally Posted by balajesuri
@vivek_d_r: What would your program print if input date is 12/01/2011 in mm/dd/yyyy????

@parthmittal2007: Here's the program you asked for:
perl code:
  1. #! /usr/bin/perl -w
  2. use strict;
  3. use Time::Local;
  4.  
  5. my ($mt, $dt, $yr, $sec, $wk_st, $wk_nd, $st_date, $nd_date);
  6.  
  7. (@ARGV != 1) && die "Invalid parameters. Enter date in mm/dd/yyyy format. Exiting";
  8. ($ARGV[0] !~ /^(0[1-9]|1[012])\/(0[1-9]|[12][0-9]|3[01])\/[\d]{4}$/)
  9. && die "Invalid date format. Enter date in mm/dd/yyyy. Exiting";
  10.  
  11. $mt = substr $ARGV[0], 0, 2;
  12. $dt = substr $ARGV[0], 3, 2;
  13. $yr = substr $ARGV[0], 6, 4;
  14.  
  15. $sec = timelocal (0, 0, 0, $dt, $mt - 1, $yr);
  16. $wk_st = $sec - (((localtime ($sec))[6] - 1) * 86400);
  17. $wk_nd = $sec + ((6 - ((localtime ($sec))[6] - 1)) * 86400);
  18.  
  19. $st_date = localtime ($wk_st);
  20. $nd_date = localtime ($wk_nd);
  21.  
  22. print "Week Start date: $st_date\n";
  23. print "Week End date: $nd_date\n";

Code:
[root@hostname test]# ./test.pl 12/01/2011
Week Start date: Mon Nov 28 00:00:00 2011
Week End date: Sun Dec  4 00:00:00 2011

---------- Post updated at 06:41 AM ---------- Previous update was at 06:41 AM ----------

awesome...

---------- Post updated at 07:06 AM ---------- Previous update was at 06:41 AM ----------

Quote:
Originally Posted by parthmittal2007
---------- Post updated at 06:41 AM ---------- Previous update was at 06:41 AM ----------

awesome...
hi. thanks for your answer.
can you please explain the line 15 to 20.
i didn't clear it very much. can you make me clear
# 10  
Old 12-22-2011
here is your code..(I fixed the bug :-) )

Code:
datee="01/01/2011"
len=${#datee}
mm=${datee:0:2}
dd=${datee:3:2}
yy=${datee:6:4}
mydate=$(date -d 01/01/2011)
day=$( echo $mydate | awk -F' ' '{print $1}' )
month=$( date -d 12/22/2011 | awk -F' ' '{print $2}' )
 
startdate=0
mon1="Jan"
mon2="Feb"
mon3="Mar"
mon4="Apr"
mon5="May"
mon6="Jun"
mon7="Jul"
mon8="Aug"
mon9="Sep"
mon10="Oct"
mon11="Nov"
mon12="Dec"
days1=31
days2=28
days3=31
days4=30
days5=31
days6=30
days7=31
days8=31
days9=30
days10=31
days11=30
days12=31
 
var1="Sun"
var2="Mon"
var3="Tue"
var4="Wed"
var5="Thu"
var6="Fri"
var7="Sat"
no1=0
no2=1
no3=2
no4=3
no5=4
no6=5
no7=6
 
for i in $(seq 1 7)
do
          val=$( eval eval echo \$var$i )
          num=$( eval eval echo \$no$i )
          if [[ "$val" == "$day" ]]
          then
                      number2=`expr $dd + 7 - $num`
                      echo "weekend: $mm/$number2/$yy"
                      date -d $mm/$number2/$yy
                      number=`expr $dd - $num + 1`
                       if [ $number -lt 1 ];then
                                     for i in $(seq 1 12)
                                     do
                                                   mont=$( eval eval echo \$mon$i )
                                                   dayno=$( eval eval echo \$days$i )
                                                    if [ "$month" == "$mont" ]; then
                                                                 number=`expr $dayno + $number`
                                                                  mm=`expr $mm - 1`
 
                                                                  if [ $mm -lt 1 ]; then
                                                                              mm=`expr 12 - $mm` 
                                                                               yy=`expr $yy - 1`
                                                                  fi
                                                   fi
 
 
                                        done
 
 
                            fi
                            echo "weekstart: $mm/$number/$yy"
                            date -d $mm/$number/$yy
             fi
done

output
Code:
weekend: 01/2/2011
Sun Jan  2 00:00:00 EST 2011
weekstart: 12/27/2010
Mon Dec 27 00:00:00 EST 2010

it works for both month and year... :-)
This User Gave Thanks to vivek d r For This Post:
# 11  
Old 12-22-2011
Line 15: Input date is converted into time in seconds from epoch (epoch on most unix systems is 01-Jan-1970 00:00:00).
Line 16: Localtime returns an array and the 7th element specifies the count of current day starting from sunday. So, if localtime were to see 12/22/2011, 7th element returned would contain 4, i.e. 4th day from Sunday starting from 0. According to your specification, week starts from Monday, so I subtracted 1 from the result. This multiplied by 86400 seconds subtracted from $sec would give prev monday's stamp in seconds from epoch.
Line 17: Similarly, the next sunday is determined.
Line 19: The time in seconds from epoch is converted to human readable format.
Line 20: Ditto.

---------- Post updated at 18:39 ---------- Previous update was at 18:28 ----------

@vivek_d_r: What would your revised program print if the input date is 02/29/2012 in mm/dd/yyyy? Smilie

Last edited by balajesuri; 12-22-2011 at 09:04 AM..
This User Gave Thanks to balajesuri For This Post:
# 12  
Old 12-22-2011
finally..... oooof.. :-) fixed the bug again

Code:
datee="02/29/2012"
len=${#datee}
mm=${datee:0:2}
dd=${datee:3:2}
yy=${datee:6:4}
mydate=$(date -d $datee)
day=$( echo $mydate | awk -F' ' '{print $1}' )
month=$( date -d 12/22/2011 | awk -F' ' '{print $2}' )
 
startdate=0
mon1="Jan"
mon2="Feb"
mon3="Mar"
mon4="Apr"
mon5="May"
mon6="Jun"
mon7="Jul"
mon8="Aug"
mon9="Sep"
mon10="Oct"
mon11="Nov"
mon12="Dec"
days1=31
days2=28
days3=31
days4=30
days5=31
days6=30
days7=31
days8=31
days9=30
days10=31
days11=30
days12=31
 
var1="Sun"
var2="Mon"
var3="Tue"
var4="Wed"
var5="Thu"
var6="Fri"
var7="Sat"
no1=0
no2=1
no3=2
no4=3
no5=4
no6=5
no7=6
mmm="$mm"
for i in $(seq 1 7)
do
        val=$( eval eval echo \$var$i )
        num=$( eval eval echo \$no$i )
        if [[ "$val" == "$day" ]]
        then
                mm="$mmm"
                number2=`expr $dd + 7 - $num`
                for i in $(seq 1 12)
                do
                        mont=$( eval eval echo \$mon$i )
                        dayno=$( eval eval echo \$days$i )
                        if [ "$month" == "$mont" ]; then
                                if [ $number2 -gt $dayno ]; then
                                        mm=`expr $mm + 1`
                                        number2=`expr $number2 - $dayno + 2`
                                        if [ $mm -gt 12 ]; then
                                                mm=`expr $mm - 12`
                                                yy=`expr $yy + 1`
                                        fi
                                fi
                        fi
                done
                echo "weekend: $mm/$number2/$yy"
                date -d $mm/$number2/$yy
                mm="$mmm"
                number=`expr $dd - $num + 1`
                if [ $number -lt 1 ];then
                for i in $(seq 1 12)
                do
                        mont=$( eval eval echo \$mon$i )
                        dayno=$( eval eval echo \$days$i )
                        if [ "$month" == "$mont" ]; then
                                number=`expr $dayno + $number`
                                mm=`expr $mm - 1`
                                if [ $mm -lt 1 ]; then
                                mm=`expr 12 - $mm`
                                yy=`expr $yy - 1`
                                fi
                        fi
 
                done
 
                fi
                echo "weekstart: $mm/$number/$yy"
                date -d $mm/$number/$yy
        fi
done

output

Code:
weekend: 3/4/2012
Sun Mar  4 00:00:00 EST 2012
weekstart: 02/27/2012
Mon Feb 27 00:00:00 EST 2012

# 13  
Old 12-23-2011
A small script for the same,

Code:
echo "Enter date[MM/DD/YYYY]:"
read datee
day=$(date -d $datee +%u)
num=`expr 7 - $day`
x="date -d '$datee $num days'"
eval $x
num=`expr $day - 1`
x="date -d '$datee $num days ago'"
eval $x

This User Gave Thanks to siva shankar For This Post:
# 14  
Old 12-23-2011
@balajesuri:
hi i didn't understand the logic you have used in line 15,16,17,18 please help me
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

PERL: In a perl-scripttTrying to execute another perl-script that SETS SOME VARIABLES !

I have reviewed many examples on-line about running another process (either PERL or shell command or a program), but do not find any usefull for my needs way. (Reviewed and not useful the system(), 'back ticks', exec() and open()) I would like to run another PERL-script from first one, not... (1 Reply)
Discussion started by: alex_5161
1 Replies

2. Shell Programming and Scripting

Excuting perl script from within a perl script with variables.

Not sure what I am doing wrong here, but I can print the list with no issue. Just a blank screen with the 'do'. #!/usr/bin/perl open FILE, "upslist.txt"; while ($line=<FILE>){ if ($line=~/^(.*?),(.*?)$/){ #print "ups:$1 string:$2\n"; do 'check_snmp_mgeups-0.1.pl -H $1 -C $2'; } ... (1 Reply)
Discussion started by: mrlayance
1 Replies

3. Shell Programming and Scripting

Perl : embedding java script with cgi perl script

Hi All, I am aware that html tags can be embedded in cgi script as below.. In the same way is it possible to embed the below javascript in perl cgi script ?? print("<form action="action.htm" method="post" onSubmit="return submitForm(this.Submitbutton)">"); print("<input type = "text"... (1 Reply)
Discussion started by: scriptscript
1 Replies

4. Shell Programming and Scripting

executing perl script from another perl script : NOT WORKING

Hi Folks, I have 2 perl scripts and I need to execute 2nd perl script from the 1st perl script in WINDOWS. In the 1st perl script that I had, I am calling the 2nd script main.pl =========== print "This is my main script\n"; `perl C:\\Users\\sripathg\\Desktop\\scripts\\hi.pl`; ... (3 Replies)
Discussion started by: giridhar276
3 Replies

5. Shell Programming and Scripting

calling a perl script with arguments from a parent perl script

I am trying to run a perl script which needs input arguments from a parent perl script, but doesn't seem to work. Appreciate your help in this regard. From parent.pl $input1=123; $input2=abc; I tried calling it with system("/usr/bin/perl child.pl $input1 $input2"); and `perl... (1 Reply)
Discussion started by: grajp002
1 Replies

6. Shell Programming and Scripting

HELP on Perl array / sorting - trying to convert Korn Shell Script to Perl

Hi all, Not sure if this should be in the programming forum, but I believe it will get more response under the Shell Programming and Scripting FORUM. Am trying to write a customized df script in Perl and need some help with regards to using arrays and file handlers. At the moment am... (3 Replies)
Discussion started by: newbie_01
3 Replies

7. Shell Programming and Scripting

Perl :How to print the o/p of a Perl script on console and redirecting same in log file @ same time.

How can i print the output of a perl script on a unix console and redirect the same in a log file under same directory simultaneously ? Like in Shell script, we use tee, is there anything in Perl or any other option ? (2 Replies)
Discussion started by: butterfly20
2 Replies

8. Shell Programming and Scripting

perl/unix: script in command line works but not in perl

so in unix this command works works and shows me a list of directories find . -name \*.xls -exec dirname {} \; | sort -u | > list.txt but when i try running a perl script to run this command my $query = 'find . -name \*.xls -exec dirname {} \; | sort -u | > list.txt';... (2 Replies)
Discussion started by: kpddong
2 Replies

9. Shell Programming and Scripting

[Perl] Accessing array elements within a sed command in Perl script

I am trying to use a script to replace the header of each file, whose filename are stored within the array $test, using the sed command within a Perl script as follows: $count = 0; while ( $count < $#test ) { `sed -e 's/BIOGRF 321/BIOGRF 332/g' ${test} > 0`; `cat 0 >... (2 Replies)
Discussion started by: userix
2 Replies

10. Shell Programming and Scripting

Perl: Run perl script in the current process

I have a question regarding running perl in the current process. I shall demonstrate with an example. Look at this. sh-2.05b$ pwd /tmp sh-2.05b$ cat test.sh #! /bin/sh cd /etc sh-2.05b$ ./test.sh sh-2.05b$ pwd /tmp sh-2.05b$ . ./test.sh sh-2.05b$ pwd /etc sh-2.05b$ So... (10 Replies)
Discussion started by: vino
10 Replies
Login or Register to Ask a Question