理解 perl 中的子程序
understanding subroutines in perl
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);
}
}
谁能解释一下这个子例程每一行都做了什么?是否使用哈希?我的 $rec={}; 是什么?使用推送会发生什么?
$rec= {}
这叫做anonymous hash reference。 name
、 type
、 length
是键 BATID
、VARCHAR2
、14
是这些键的值。
而$rec->{ref_col}
这个键值是anonymous array。
{ LIST }
基本等同于
do { my %anon = LIST; \%anon }
它创建一个散列,然后将 LIST
(如果存在)生成的标量分配给散列,然后创建对散列的引用。整体评估为该参考。
sub 可以很容易地写成如下:
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;
}
}
你要求解释每一行发生的事情,但我认为你还没有理解。
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.
}
总而言之,您的代码做了很多工作,但所有这些工作都被浪费了,因为它使用的变量在子例程结束时都被丢弃了。所以调用这个子程序的净效果是绝对没有的。
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);
}
}
谁能解释一下这个子例程每一行都做了什么?是否使用哈希?我的 $rec={}; 是什么?使用推送会发生什么?
$rec= {}
这叫做anonymous hash reference。 name
、 type
、 length
是键 BATID
、VARCHAR2
、14
是这些键的值。
而$rec->{ref_col}
这个键值是anonymous array。
{ LIST }
基本等同于
do { my %anon = LIST; \%anon }
它创建一个散列,然后将 LIST
(如果存在)生成的标量分配给散列,然后创建对散列的引用。整体评估为该参考。
sub 可以很容易地写成如下:
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;
}
}
你要求解释每一行发生的事情,但我认为你还没有理解。
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.
}
总而言之,您的代码做了很多工作,但所有这些工作都被浪费了,因为它使用的变量在子例程结束时都被丢弃了。所以调用这个子程序的净效果是绝对没有的。