Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 存储在数据结构中的匿名子例程/子例程引用_Perl_Perl Data Structures - Fatal编程技术网

Perl 存储在数据结构中的匿名子例程/子例程引用

Perl 存储在数据结构中的匿名子例程/子例程引用,perl,perl-data-structures,Perl,Perl Data Structures,激励我思考以下优点: 在数组、散列和标量中存储匿名sub 这是一个很酷的概念,但它在任何方面都是实用的吗?有什么理由我必须使用存储在某种数据结构中的匿名sub/sub引用吗?或者是一种方便的情况 我理解为什么在某些上下文中需要匿名子函数,比如处理共享变量(当一个匿名子函数在另一个子函数中声明时),但除非我遗漏了什么,否则我不认为使用任何类型的函数引用有什么意义。看起来我们应该直接调用函数,代码看起来会更好/更有条理 请告诉我我错了。我希望有一个很好的理由使用这些东西 提前谢谢 调度表可用于根

激励我思考以下优点:

  • 在数组、散列和标量中存储匿名sub
这是一个很酷的概念,但它在任何方面都是实用的吗?有什么理由我必须使用存储在某种数据结构中的匿名sub/sub引用吗?或者是一种方便的情况

我理解为什么在某些上下文中需要匿名子函数,比如处理共享变量(当一个匿名子函数在另一个子函数中声明时),但除非我遗漏了什么,否则我不认为使用任何类型的函数引用有什么意义。看起来我们应该直接调用函数,代码看起来会更好/更有条理

请告诉我我错了。我希望有一个很好的理由使用这些东西


提前谢谢

调度表可用于根据某些值动态确定要采取的步骤:

my %disp = (
   foo => sub { 'foo' },
   bar => sub { 'bar' },
);

my $cmd = get_cmd_somehow();
if (defined $disp{$cmd}) {
  $disp{$cmd}->(@args)
} else {
  die "I don't know how to handle $cmd"
}
(通过->can($Method)发送方法在概念上类似,但更灵活,细节隐藏。)


匿名函数和词法闭包还有许多其他用途;也许可以更深入地研究“高阶函数”(例如,考虑map()/grep())

调度表对于根据某些值动态确定要采取的步骤非常有用:

my %disp = (
   foo => sub { 'foo' },
   bar => sub { 'bar' },
);

my $cmd = get_cmd_somehow();
if (defined $disp{$cmd}) {
  $disp{$cmd}->(@args)
} else {
  die "I don't know how to handle $cmd"
}
(通过->can($Method)发送方法在概念上类似,但更灵活,细节隐藏。)


匿名函数和词法闭包还有许多其他用途;也许可以更深入地研究“高阶函数”(例如,考虑map()/grep())

面向对象的方法与匿名子例程非常相似。多态性意味着对象的方法可以更改,而无需调用代码手动查找以查看要运行的例程。这是非常有用的

另外,考虑perl的排序。为什么只为简单的排序方法设置命名例程?同上地图和grep

同样,迭代器也非常有用。另外,考虑存储一个可以稍后解析的例程,而不是只存储一个静态值


最后,如果您不想存储匿名例程(甚至是对例程的引用),那就是您的事情。但是拥有这个选项比没有要好得多。

面向对象的方法非常类似于匿名子例程。多态性意味着对象的方法可以更改,而无需调用代码手动查找以查看要运行的例程。这是非常有用的

另外,考虑perl的排序。为什么只为简单的排序方法设置命名例程?同上地图和grep

同样,迭代器也非常有用。另外,考虑存储一个可以稍后解析的例程,而不是只存储一个静态值


最后,如果您不想存储匿名例程(甚至是对例程的引用),那就是您的事情。但拥有该选项比没有要好得多。

查阅调度表的概念。嗯,符号表基本上是一个巨大的HoH(任意深度),它包含对每个命名子的引用。这只是许多用途中的一种。@ikegami有些语言不是也将其用于函数中的闭包,以便跟踪程序状态吗?Perl是解释的,而不是编译的,对吗?那么后期绑定的好处是什么呢?我看到分派表的示例是用perl编写的,但这有什么意义呢?分派表的意义在于它允许您轻松避免一堆杂乱的if/elsif/elsif语句。它简化了动态规则集,而不是硬编码逻辑。它灵活轻便。阅读高阶Perl(),然后询问要点是什么。查找分派表的概念。嗯,符号表基本上是一个巨大的HoH(任意深度),它包含对每个命名子的引用。这只是许多用途中的一种。@ikegami有些语言不是也将其用于函数中的闭包,以便跟踪程序状态吗?Perl是解释的,而不是编译的,对吗?那么后期绑定的好处是什么呢?我看到分派表的示例是用perl编写的,但这有什么意义呢?分派表的意义在于它允许您轻松避免一堆杂乱的if/elsif/elsif语句。它简化了动态规则集,而不是硬编码逻辑。它灵活轻便。阅读高阶Perl(),然后问问题的重点是什么。分派不是使用匿名子例程的解释。使用普通的命名子例程可以实现同样的效果:my%disp=(foo=>\&disp\u foo,bar=>\&disp\u bar);这是真的,也解决了问题的第二部分,关于存储在数据结构中的子引用。分派不是使用匿名子例程的解释。使用普通的命名子例程可以实现同样的效果:my%disp=(foo=>\&disp\u foo,bar=>\&disp\u bar);这是真的——同时也解决了问题的第二部分,关于存储在数据结构中的子引用。