2017-01-04 16 views
-1

У меня есть следующая подпрограмма, которую я должен передать подпрограмму как hashtable, и эта хэш-таблица должна быть снова вызвана внутри другой подпрограммы с использованием perl?Как передать всю функцию подпрограммы в хэш-таблицу с использованием perl?

входной файл (из командной bdata Linux):

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

Что вы подразумеваете под «_pass my subroutine ** as hash ** _"? Вы можете передать подпрограмму как coderef, но что такое «_as hash_»? Кроме того, вы показываете «g_usrs_data», но затем в «_example_» используйте 'usrs_hash' и' create_db'? Что означает ', $ sql1m'? «_example_» полностью неясен, а не правильный код. Вы можете уточнить? – zdim

+0

Я хочу передать ту же функцию подпрограммы (i.e g_usrs_data) в другую подпрограмму с другим именем (i.e usrs_hash) с использованием хэшей. @ Zdim –

+1

OK ... что вы подразумеваете под «_using hashes_»? Вы можете передавать подпрограммы с помощью _code reference_, который, как и любая ссылка, является скаляром. Я не понимаю, какие хеши имеют отношение к этому. (Вы _can_, чтобы эта ссылка на код была значением хэш-пары, если это то, что вы имеете в виду.) – zdim

ответ

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->();, где в скобках мы можем передать его аргументы

Обратите внимание, что синтаксис для создания и использовать их точно так же как для о þér типов данных

  • Как анонимно присваивать = sub { }, так же, как = [ ] (ссылка на массиве) и = { } (hashref)

  • Для поименованных к югу использовать & вместо сигилов, так \& для суба против \@ (массив) и \% (хэш)

  • Они используются ->() вместо ->[]() и ссылку на массив ->{} (hashref)

Для справок в целом см. perlreftut. Подпрограммы покрыты по глубине в perlsub.


Смотрите, например this post на анонимных подлодки, с количеством ответов.

Для более см this article из Mastering Perl и this article от Эффективного Perler.