如何在Perl哈希中存储和使用变量和子例程名称?

hw_engineer_trying_to_write_sw

我的程序处理两种“东西”,每种风味都有自己的数据结构和处理它们的过程。用户使用以下一项或两项来调用程序:

  • -f1 path_to_file_with_flavor_1_data
  • -f2 path_to_file_with_flavor_2_data

我的程序的工作代码为:

GetOptions ('f1=s' => \$f1_path,
            'f2=s' => \$f2_path,
           );

if (defined $f1_path) {
  subroutine_to_process_flavor_1_data( $f1_path );
}
if (defined $f2_path) {
  subroutine_to_process_flavor_2_data( $f2_path );
}

它具有单个哈希来存储两种风味的处理后数据:

my %flv_hash = ( flavor_1 => { datahash => { ... },
                             },
                 flavor_2 => { datahash => { ... },
                             },
               );

现在,我想将每种风味的变量和子例程名称添加到哈希中以使其:

my %flv_hash = ( flavor_1 => { datahash => { ... },
                               var_name => 'f1_path',
                               sub_name => 'subroutine_to_process_flavor_1_data',
                              },
                 flavor_2 => { datahash => { ... },
                               var_name => 'f2_path',
                               sub_name => 'subroutine_to_process_flavor_2_data',
                              },
               );

并将我的程序更改为以下伪代码:

foreach my $flavor ( keys %flv_hash ) {
   if (defined <the variable named $flv_hash{flavor}{var_name}>) {
      <call the subroutine named $flv_hash{flavor}{sub_name}>
   }
}

我搜索了有关存储和检索哈希中变量和子例程的名称的所有知识库,但是,作为一名硬件工程师,其软件技能仅限于我大约35年前在《基本编程101》中学到的知识,无法直接复制示例并使它们在我的程序中运行。换句话说,如果可能的话,我希望能复制并使用一个解决方案,而无需深入了解它们所基于的Perl范例。再次感谢你。

出租

在这种漂亮的布局中,有一件事情是使用名称,子例程和变量,形成哈希的方式-然后,您实际上不能使用这些东西来运行子例程或评估变量,只是他们的裸名。

相反,您可以采用子例程引用,它是一个标量,因此可以是一个哈希值,然后可以通过对它进行解引用来执行该子例程。并使用变量作为值。

哈希

my %flv_hash = ( 
    flavor_1 => { 
        data => { ... },
        var  => $f1_path,
        code => \&subroutine_to_process_flavor_1_data,
    },
    flavor_2 => { 
        data => { ... },
        var  => $f2_path,
        code => \&subroutine_to_process_flavor_2_data,
    },
);

code该键只是一个占位符,代表一个更好的名称)。按照指示使用

foreach my $flavor ( keys %flv_hash ) {
   if (defined $flv_hash{$flavor}{var}) {
      $flv_hash{$flavor}{code}->( $flv_hash{$flavor}{var} );
   }
}

\&sub_name语法如下,并返回到子程序参考,所以是一个标量,其可以被分配和/或操纵任何其它标量。

创建此类代码引用的另一种方法是使用匿名子例程,方法是使用语法直接分配子例程代码

my $code_reference = sub { subroutine-code };

code => sub { ... }如果这些子又短又甜,您也可以在hash()中执行什么操作

然后,符号$coderef->( LIST )就是我们如何在标量变量中执行带有其引用的子例程$coderef如果没有参数,则需要空括号。

一旦采用代码引用,当然有许多方法可以组织这种情况。我只是遵循这个问题的合理意图。与此相关的另一个有用的项目是调度表此页面上一个最新参考,并且还有更多参考。

又见例如这个职位,并为更本文来自的有效Perler ...等。


我想到可能也需要子名称本身。

从代码引用中检索名称的一种简单方法是使用Sub :: Util

use Sub::Util qw(subname);

say subname( $coderef );

我认为这是内核,因为perl-5.22.0(?)。CPAN上还有Sub :: Identify

然后,全能的B给出了以及更多的via svref_2oject($coderef),它通过代码返回一个B :: CV对象,在该对象上也可以使用B :: GV方法

use B qw(svref_2object);

my $cv = svref_2oject($coderef);

say for $cv->FILE, $cv->GV->NAME;  # etc

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将数组,标量和哈希传递给Perl中的子例程

来自分类Dev

如何在猪中存储和使用变量

来自分类Dev

如何在子例程中传递数组的哈希?

来自分类Dev

Perl函数和子例程

来自分类Dev

如何在LESS中使用变量变量并将颜色存储在循环和混合中的命名变量中?

来自分类Dev

Perl如何在子例程和主脚本之间组织代码

来自分类Dev

Perl中未定义的子例程和主要错误

来自分类Dev

在Python中,如何在变量中存储子变量和函数?

来自分类Dev

如何在SSIS变量中存储“完全限定”和“仅名称”文件名

来自分类Dev

如何在Common Lisp中返回变量的值和名称

来自分类Dev

如何使用Doxygen和Doxygen :: Filter :: Perl生成Perl子例程的文档?

来自分类Dev

在Perl中以下划线开头的子例程名称

来自分类Dev

如何在Laravel 5中使用输入名称创建存储文件夹和子文件夹

来自分类Dev

如何在Perl中创建动态子例程名称

来自分类Dev

在perl中处理深层软件包名称及其导出的常量和子例程

来自分类Dev

如何在R中的绘图和/或模型创建中使用变量名称

来自分类Dev

mainfunction的参数和变量在子例程中可以安全使用吗?

来自分类Dev

将数组,标量和哈希传递给Perl中的子例程

来自分类Dev

检测如何在Perl中调用子例程

来自分类Dev

从Perl哈希表存储和获取值

来自分类Dev

将数组和哈希传递给Perl中多个线程的子例程

来自分类Dev

Perl如何在子例程和主脚本之间组织代码

来自分类Dev

Perl中未定义的子例程和主要错误

来自分类Dev

如何获取带有子例程的开始和结束行号的perl子例程列表?

来自分类Dev

如何在Perl哈希中存储null

来自分类Dev

Perl:如何访问传递给子例程的哈希数组

来自分类Dev

哈希函数和哈希表中的存储

来自分类Dev

如何在命令中存储和扩展变量?

来自分类Dev

如何在 Selenium 代码中存储和列出变量?

Related 相关文章

  1. 1

    将数组,标量和哈希传递给Perl中的子例程

  2. 2

    如何在猪中存储和使用变量

  3. 3

    如何在子例程中传递数组的哈希?

  4. 4

    Perl函数和子例程

  5. 5

    如何在LESS中使用变量变量并将颜色存储在循环和混合中的命名变量中?

  6. 6

    Perl如何在子例程和主脚本之间组织代码

  7. 7

    Perl中未定义的子例程和主要错误

  8. 8

    在Python中,如何在变量中存储子变量和函数?

  9. 9

    如何在SSIS变量中存储“完全限定”和“仅名称”文件名

  10. 10

    如何在Common Lisp中返回变量的值和名称

  11. 11

    如何使用Doxygen和Doxygen :: Filter :: Perl生成Perl子例程的文档?

  12. 12

    在Perl中以下划线开头的子例程名称

  13. 13

    如何在Laravel 5中使用输入名称创建存储文件夹和子文件夹

  14. 14

    如何在Perl中创建动态子例程名称

  15. 15

    在perl中处理深层软件包名称及其导出的常量和子例程

  16. 16

    如何在R中的绘图和/或模型创建中使用变量名称

  17. 17

    mainfunction的参数和变量在子例程中可以安全使用吗?

  18. 18

    将数组,标量和哈希传递给Perl中的子例程

  19. 19

    检测如何在Perl中调用子例程

  20. 20

    从Perl哈希表存储和获取值

  21. 21

    将数组和哈希传递给Perl中多个线程的子例程

  22. 22

    Perl如何在子例程和主脚本之间组织代码

  23. 23

    Perl中未定义的子例程和主要错误

  24. 24

    如何获取带有子例程的开始和结束行号的perl子例程列表?

  25. 25

    如何在Perl哈希中存储null

  26. 26

    Perl:如何访问传递给子例程的哈希数组

  27. 27

    哈希函数和哈希表中的存储

  28. 28

    如何在命令中存储和扩展变量?

  29. 29

    如何在 Selenium 代码中存储和列出变量?

热门标签

归档