我的程序处理两种“东西”,每种风味都有自己的数据结构和处理它们的过程。用户使用以下一项或两项来调用程序:
-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] 删除。
我来说两句