は、あなたはすべての行に何が起こっているかの説明を聞いて、私はあなたがまだそれを持っているとは思いません。要約する
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.
}
、あなたのコードは、多くの作業を行いますが、それが使用する変数は、すべてのサブルーチンが終了すると捨てられるように、すべてのその仕事が無駄になります。したがって、このサブルーチンを呼び出す正味の効果は全くありません。
https://perldoc.perl.org/perlreftut.html&https://perldoc.perl.org/functions/push.html –
しかし、このサブは私にはほとんど役に立たないようです。 $ recはブロックの終わりにスコープから外れ、subはpush()によって返された値を返します。 – ulix
@ulix: '$ rec'がサブルーチンの終了時にスコープから外れるという事実は問題ではありません。その参照は' @gCol'に格納されています。問題は '@ gCol'もスコープの外に出てくるのと全く同じです:-) –