为此,有没有办法在访问其密钥时执行匿名子例程,而不使用任何特殊语法?这是一个简化的例子,说明了目标和问题:
#!/usr/bin/perlmy %hash = ( key1 => "value1",key2 => sub { return "value2"; # In the real code,this value can differ },);foreach my $key (sort keys %hash) { print $hash{$key} . "\n";}
我想要的输出是:
perl ./test.plvalue1value2
相反,这就是我得到的:
perl ./test.plvalue1CODE(0x7fb30282cfe0)解决方法 有一个叫做“魔术”的功能,允许在访问变量时调用代码.
为变量添加魔法大大减慢了对该变量的访问速度,但有些变量比其他变量更昂贵.
>没有必要访问散列魔法的每个元素,只需要一些值.
>领带是一种更昂贵的魔法形式,这里不需要它.
因此,最有效的解决方案如下:
use Time::HiRes qw( time );use Variable::Magic qw( cast wizard );{ my $wiz = wizard( data => sub { my $code = $_[1]; $code },get => sub { ${ $_[0] } = $_[1]->(); },); sub make_evaluator { cast($_[0],$wiz,$_[1]) }}my %hash;$hash{key1} = 'value1';make_evaluator($hash{key2},sub { 'value2@'.time });print("$hash{$_}\n") for qw( key1 key2 key2 );
输出:
value1value2@1462548850.76715value2@1462548850.76721
其他例子:
my %hash; make_evaluator($hash{key},sub { ... });my $hash; make_evaluator($hash->{$key},sub { ... });my $x; make_evaluator($x,sub { ... });make_evaluator(my $x,sub { ... });make_evaluator(...,sub { ... });make_evaluator(...,\&some_sub);
您还可以“修复”现有哈希.在哈希散列场景中,
my $hoh = { { key1 => 'value1',key2 => sub { ... },... },...);for my $h (values(%$hoh)) { for my $v (values(%$h)) { if (ref($v) eq 'CODE') { make_evaluator($v,$v); } }}总结
以上是内存溢出为你收集整理的perl – 自动调用作为子例程引用的哈希值全部内容,希望文章能够帮你解决perl – 自动调用作为子例程引用的哈希值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)