首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl中的非本地返回(从调用方返回)

Perl中的非本地返回(从调用方返回)
EN

Stack Overflow用户
提问于 2012-04-29 12:33:34
回答 4查看 288关注 0票数 2

有没有办法让我从打电话的人那里回来,而不是打电话的人呢?例如:

代码语言:javascript
复制
sub foo {
    bar();
    # this never gets executed
}

sub bar {
    return_from_caller(5);
}

# This prints 5
print foo();

(基本原理:我正在编写一个函数memoize_self,它从函数本身中回传一个函数。我希望它像这样工作:

代码语言:javascript
复制
sub complex_function {
    my ($x, $y) = @_;
    memoize_self({key => $y, expires_in => '5min'));
    # compute $result
    return $result;
}

memoize_self将检查其缓存,如果成功,则从调用方返回缓存的值。否则,它将重新调用函数(使用动态范围的var以避免明显的无限循环),将返回值存储在缓存中,然后再次返回它。

如果不能从调用方返回,我可能会使用$_并以如下方式编写:

代码语言:javascript
复制
return $_ if memoize_self({key => $y, expires_in => '5min'));

但这是额外的噪音,也没有考虑到上下文。)

编辑:对那些合理建议追忆的人来说-是的,我应该说,我很了解这个模块。我正在编写一个基于志志的更现代、更有特色的回忆录版本。

但是与这个问题有关的是,在某些情况下,从功能内部而不是在功能之外回忆录是有用的(回忆录只做后一种功能)。它使自定义缓存键和/或确定是否要对此特定调用进行回忆录变得非常容易。例如:

代码语言:javascript
复制
sub complex_function {
    my $key = ...;   # normalize arguments
    if (...) {       # is it worth memoizing in this case?
        memoize_self({key => $key});
    }
}

我还喜欢它封装在函数中的方式,而不是在外部创建自己的行ala 状态变量

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-29 13:25:57

续::逃亡做你想做的事。然而,正如尼基尔所指出的,追忆才是你真正需要的。

票数 7
EN

Stack Overflow用户

发布于 2012-04-29 12:57:17

看看CPAN模块追忆 --用时间交换空间使函数更快,这可能会解决您的问题。

票数 1
EN

Stack Overflow用户

发布于 2012-04-29 14:35:05

“有什么办法让我从打电话的人那里回来,而不是打电话的人呢?”

是的,有几个。

  • 您可以使用goto向后跳。见perldoc -f goto
  • 您可以使用evaldie进行更多的控制跳转。见perldoc -f evalperldoc -f die
  • 而不是以正常的方式调用你的潜艇,你可以goto它。当您这样做,它将返回到与goto调用者的子。见perldoc -f goto

当然,大多数人会告诉您重写所有东西以避免gotos,并使维护代码的人的生活变得更容易,但是他们为您做了什么呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10372150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档