당신은 모든 라인에 무슨 일이 일어나고 있는지에 대한 설명을 요청하고 난 당신이 아직있어 생각하지 않습니다.
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'도 정확히 같은 시간에 범위를 벗어납니다. –