sub bat
{
my ($abc) = @_;
my @gCol ;
{
my $rec = {};
$rec->{name} = "BATID";
$rec->{type} = "VARCHAR2";
$rec->{length} = "14";
$rec->{scale} = "0";
$rec->{label} = "Id";
$rec->{ref_comment} = "Shows bat type";
$rec->{ref_link} ="$APPL_HOME/bat.cgioptions=Status&options=mfgDate&options=Details&options=RefreshAuto";
$rec->{ref_col} = [ ("BAT_ID") ];
$rec->{nullable} = "Y";
$rec->{pk} = "N";
$rec->{print} = undef;
$rec->{visible} = "Yes";
push (@gCol, $rec);
}
}
Can anyone explain this subroutine what is being done in each line ? and is hash used in this or not? what is my $rec= {};? what happens by using push?
You ask for an explanation of what is happening on every line and I don't think you've got that yet.
sub bat
{
# Take the first parameter passed to the subroutine and store
# it in a variable called $abc.
# This value is then ignored for the rest of the subroutine, so
# this line of code is pointless.
my ($abc) = @_;
# Declare an array variable called @gCol.
my @gCol ;
# Start a new block of code.
{
# Declare a scalar variable called $rec.
# Initialise it with a reference to an empty, anonymous hash
my $rec = {};
# The next dozen lines are pretty much all the same.
# Each of them inserts a key/value pair into the $rec hash.
$rec->{name} = "BATID";
$rec->{type} = "VARCHAR2";
$rec->{length} = "14";
$rec->{scale} = "0";
$rec->{label} = "Id";
$rec->{ref_comment} = "Shows bat type";
# This line is slightly interesting as it uses the value
# of a global variable called $APPL_HOME.
# Using global variables inside a subroutine is a really
# bad idea as it limits the portability of the subroutine.
$rec->{ref_link} ="$APPL_HOME/bat.cgioptions=Status&options=mfgDate&options=Details&options=RefreshAuto";
# This line is also interesting as instead of setting the
# value to a scalar value, it sets it to a reference to an
# anonymouse array.
$rec->{ref_col} = [ ("BAT_ID") ];
$rec->{nullable} = "Y";
$rec->{pk} = "N";
$rec->{print} = undef;
$rec->{visible} = "Yes";
# Having set up a hash with twelve key/value pairs, you
# then push the hash reference onto the (currently empty)
# array, @gCol.
push (@gCol, $rec);
# The next line marks the end of the block of code.
# Because the $rec variable was declared inside this block,
# It will now go out of scope and ceases to exist.
# However, because the reference is still stored in @gCol,
# the memory will not be recovered, so your hash still exists.
}
# This line marks the end of the subroutine. This is also the
# end of scope for any variables declared within the subroutine.
# That includes the @gCol array which ceases to exist at this
# point. Unfortunately, this means that our carefully constructed
# hash also ceases to exist at this point and all our work
# is wasted.
}
To summarise, your code does a lot of work, but all that work is wasted as the variables it uses are all thrown away as the subroutine ends. So the net effect of calling this subroutine is absolutely nothing.