如何使用perl将整个子例程函数传递给哈希表数据?

时间:2017-01-04 06:10:42

标签: perl hashtable subroutine

我有以下子程序,我应该将例程作为哈希表传递,并且应该使用perl在另一个子例程函数中再次调用哈希表?

输入文件(来自linux命令bdata):

NAME     PEND RUN SUSP JLIM JLIMR   RATE   HAPPY
achandra 0    48  0    2000 50:2000 151217 100%
agutta   1    5   0    100  50:100  16561  83%

我的子程序:

sub g_usrs_data()
{
    my($lines) = @_;    
    my $header_found = 0;
    my @headers = ();
    my $row_count = 0;
    my %table_data = ();
    my %row_data = ();

    $lines=`bdata`; 
    #print $lines;
    foreach (split("\n",$lines)) {
        if (/NAME\s*PEND/) {
            $header_found = 1;  
            @headers =split;
        }
        elsif (/^\s*$/) 
            {
                $header_found=0;
            }
            $row_data{$row_count++} = $_;
            #print $_;
        }

我的查询:

如何将我的子程序作为哈希传递给另一个子程序?

例如: g_usrs_data() - >这是我的子程序。

上面的子程序函数应该传递给另一个子程序函数(即作为哈希表进入usrs_hash)

例如: CREATE_DB(usrs_hash,$ sql1m)

1 个答案:

答案 0 :(得分:2)

子程序可以作为代码引用传递。请参阅perlref

匿名子程序

的示例
use warnings;
use strict;

my $rc = sub { 
    my @args = @_; 
    print "\tIn coderef. Got: |@_|\n"; 
    return 7;  
};             # note the semicolon!

sub use_rc {
    my ($coderef, @other_args) = @_; 
    my $ret = $coderef->('arguments', 'to', 'pass');
    return $ret;
}

my $res = use_rc($rc);
print "$res\n";

这个愚蠢的程序打印

        In coderef. Got: |arguments to pass|
7

有关代码参考的说明

  • 将匿名子例程分配给标量$rc,使其成为代码参考

  • 使用现有(已命名)子,例如func,代码引用由my $rc = \&func;

  • 生成
  • 这个$rc是一个普通的标量变量,可以像其他任何一样传递给子程序

  • 然后由$rc->();调用子句,在括号中我们可以传递参数

请注意,创建和使用它们的语法与其他数据类型一样

  • = sub { }匿名分配,非常类似于= [ ](arrayref)和= { }(hashref)

  • 对于已命名的子使用&而不是sigil,因此\&代表\@(数组)和\%(哈希)

  • 它们由->()使用,而不是->[](arrayref)和->{}(hashref)

对于一般参考文献,请参阅perlreftut。子程序在perlsub中有详细介绍。

请参阅匿名潜艇上的this post示例,其中包含许多答案。

更多信息请参阅掌握Perl this article The Effective Perler 中的this article