user1814718
user1814718

Reputation: 31

Perl Script calling Subroutines within Subroutines?

Hi So I created the following script for outputing to a wiki page. The problem is that I am not sure in how to format my output. Here is my code:

    #!/usr/bin/perl
use strict;
use warnings;
use POSIX qw/strftime/;
#use warnings;
my $TOTALIOS = 'totalios';
my $READP = 'readpe';
my $CACHEP = 'cachehit';
my $CKBSEC = 'currentkb';
my $MKBSEC = 'maximumkb';
my $CIOSEC = 'currentio';
my $MIOSEC = 'maxio';
my $DATESTORE = 'dates.sec';
my $DATECMD = strftime "%m/%d/%y", localtime;
my $TIOS = 'Tios';
my $READp = 'readp';
my $CACHEp = 'cachep';
my $CKBsec = 'ckbsec';
my $MKBsec = 'mkbsec';
my $CIOsec = 'ciosec';
my $MIOsec = 'miosec';
my ($STORENUM, $STORENAME, $IMGPREFIX, $MONTH, $DAY, $YEAR) = &mysubinput;
sub mysubinput
{
    print "Enter the number for the datastore: \n";
        my $STORENUM = <STDIN>;
        chomp($STORENUM);
        print "Enter the name for the datastore e.g: DataStore or ServerStore: \n";
        my $STORENAME = <STDIN>;
        chomp($STORENAME);
        print "Enter the data store image prefix e.g. datastore or serverstore: \n";
        my $IMGPREFIX = <STDIN>;
        chomp($IMGPREFIX);
        print "Enter the month MM: \n";
        my $MONTH = <STDIN>;
        chomp($MONTH);
        print "Enter the day DD: \n";
        my $DAY = <STDIN>;
        chomp($DAY);
        print "Enter the Year YYYY: \n";
        my $YEAR = <STDIN>;
        chomp($YEAR);
    return ($STORENUM, $STORENAME, $IMGPREFIX, $MONTH, $DAY, $YEAR);
#   print "$STORENUM $STORENAME $IMGPREFIX $MONTH $DAY $YEAR\n";
#   print "Not a very interesting routine\n";
#   print "This does the same thing every time\n";
#   print "$TOTALIOS\n";
#   print "Enter the number for the datastore: \n";
#   $line = <STDIN>;
#   chomp($line);
#   print "$line\n";
#   print "$DATECMD\n";
}
sub writedate 
{
    print "! $DATECMD\n";   
}    

sub writesections(mysubinput())
{

    print "| [[File:$STORENAME-$STORENUM-$TIOS-$MONTH-$DAY-$YEAR.png| 100px]]\n";
    print "| [[File:$STORENAME-$STORENUM-$READp-$MONTH-$DAY-$YEAR.png| 100px]]\n";
    print "| [[File:$STORENAME-$STORENUM-$CACHEp-$MONTH-$DAY-$YEAR.png| 100px]]\n";
    print "| [[File:$STORENAME-$STORENUM-$CKBsec-$MONTH-$DAY-$YEAR.png| 100px]]\n";
    print "| [[File:$STORENAME-$STORENUM-$MKBsec-$MONTH-$DAY-$YEAR.png| 100px]]\n";
    print "| [[File:$STORENAME-$STORENUM-$CIOsec-$MONTH-$DAY-$YEAR.png| 100px]]\n";
    print "| [[File:$STORENAME-$STORENUM-$MIOsec-$MONTH-$DAY-$YEAR.png| 100px]]\n";
}   

sub writepage
{
    &mysubinput;
    print "Go back to [[MD3000i-Perf]] \n";
    print "{| border=1 cellspacing=5 cellpadding=2 style=text-align: center \n";
    print "|-\n";
    print "! [[DataStore-1]]\n";
    print "! [[DataStore-2]]\n";
    print "! [[DataStore-3]]\n";
    print "! [[DataStore-4]]\n";
    print "! [[DataStore-5]]\n";
    print "! [[DataStore-6]]\n";
    print "! [[DataStore-7]]\n";
    print "! [[DataStore-8]]\n";
    print "! [[DataStore-9]]\n";
    print "|-\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "| [[File:disk.png |60px]]\n";
    print "|}\n";
    print "{| border=1 cellspacing=5 cellpadding=2 style=text-align: center\n";
    print "|-\n";
    &writedate;
    print " |-\n";
    &writesections;
    print " |-}\n";
}
#&mysubinput;
&writepage;
#&mysubinput;
#&writesections;

Using this approach things seem to work. However, my input is not 100% right. I have to input all my data twice, before the program can spit somthing ....

Enter the number for the datastore:
1
Enter the name for the datastore e.g: DataStore or ServerStore:
DataStore
Enter the data store image prefix e.g. datastore or serverstore:
datastore
Enter the month MM:
12
Enter the day DD:
03
Enter the Year YYYY:
2012
Enter the number for the datastore:
1
Enter the name for the datastore e.g: DataStore or ServerStore:
DataStore
Enter the data store image prefix e.g. datastore or serverstore:
datastore
Enter the month MM:
12
Enter the day DD:
03
Enter the Year YYYY:
2012
Go back to [[MD3000i-Perf]]
{| border=1 cellspacing=5 cellpadding=2 style=text-align: center
|-
! [[DataStore-1]]
! [[DataStore-2]]
! [[DataStore-3]]
! [[DataStore-4]]
! [[DataStore-5]]
! [[DataStore-6]]
! [[DataStore-7]]
! [[DataStore-8]]
! [[DataStore-9]]
|-
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
| [[File:disk.png |60px]]
|}
{| border=1 cellspacing=5 cellpadding=2 style=text-align: center
|-
! 12/04/12
        |-
| [[File:DataStore-1-Tios-12-03-2012.png| 100px]]
| [[File:DataStore-1-readp-12-03-2012.png| 100px]]
| [[File:DataStore-1-cachep-12-03-2012.png| 100px]]
| [[File:DataStore-1-ckbsec-12-03-2012.png| 100px]]
| [[File:DataStore-1-mkbsec-12-03-2012.png| 100px]]
| [[File:DataStore-1-ciosec-12-03-2012.png| 100px]]
| [[File:DataStore-1-miosec-12-03-2012.png| 100px]]
        |-}

Things seem to work now after adding this variable to 'my'

my ($STORENUM, $STORENAME, $IMGPREFIX, $MONTH, $DAY, $YEAR) = &mysubinput;

second piece was to add return ($STORENUM, $STORENAME, $IMGPREFIX, $MONTH, $DAY, $YEAR);

Now my questions is how do i get the output from sub writesections into a file, such as datastore.wk?

Upvotes: 0

Views: 373

Answers (2)

Borodin
Borodin

Reputation: 126752

If you had use strict and use warnings enabled you would see messages like

Global symbol "$STORENAME" requires explicit package name

which are there to help you debug your program.

The problem is that the variables you have declared within mysubinput are local to that subroutine and will be discarded when the subroutine returns. As far as writesections is concerned these variables have never been declared, and the program won't compile.

Uncomment those use statements, and add declarations for $DAY, $MONTH, $STORENAME, $STORENUM, and $YEAR before the first subroutine that uses them, and remove the my from those variables within the subroutines. Then they will be accessible throughout the rest of the file and your program should work.

By the way, calling subroutines with &mysubinput is a very old style indeed. You should use mysubinput() throughout.

Upvotes: 2

creaktive
creaktive

Reputation: 5220

Do not ever comment the use strict line :)

It would alert you that your writesections sub doesn't have the access to the variables declared inside the scope of mysubinput!

I suggest you to learn about private variables first. To share your variables, you should return them. Following your logic:

sub mysubinput
{
    ...
    return ($STORENUM, $STORENAME, $IMGPREFIX, $MONTH, $DAY, $YEAR);
}

my ($STORENUM, $STORENAME, $IMGPREFIX, $MONTH, $DAY, $YEAR) = mysubinput();
writesections($STORENAME, $STORENUM, $MONTH, $DAY, $YEAR);

However, if you expect to grow your Perl script, sooner or later you'll have to learn Object-Oriented Programming. Then, Moose framework is your friend.

Upvotes: 1

Related Questions