perl – 自动调用作为子例程引用的哈希值

perl – 自动调用作为子例程引用的哈希值,第1张

概述我有一个散列,其中有一些值不是标量数据,而是返回标量数据的匿名子程序.我想让这对于在哈希中查找值的代码部分完全透明,这样它就不必知道某些哈希值可能是返回标量数据的匿名子例程而不仅仅是普通的标量数据. 为此,有没有办法在访问其密钥时执行匿名子例程,而不使用任何特殊语法?这是一个简化的例子,说明了目标和问题: #!/usr/bin/perlmy %hash = ( key1 => "val 我有一个散列,其中有一些值不是标量数据,而是返回标量数据的匿名子程序.我想让这对于在哈希中查找值的代码部分完全透明,这样它就不必知道某些哈希值可能是返回标量数据的匿名子例程而不仅仅是普通的标量数据.

为此,有没有办法在访问其密钥时执行匿名子例程,而不使用任何特殊语法?这是一个简化的例子,说明了目标和问题:

#!/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 – 自动调用作为子例程引用的哈希值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1267276.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存