理解 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 referencenametypelength 是键 BATIDVARCHAR214 是这些键的值。

$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.
}

总而言之,您的代码做了很多工作,但所有这些工作都被浪费了,因为它使用的变量在子例程结束时都被丢弃了。所以调用这个子程序的净效果是绝对没有的。