perl - Perl 中的非本地返回(从调用者返回)

标签 perl

有没有办法让我我的来电者而不是我的来电者?例如

sub foo {
    bar();
    # this never gets executed
}

sub bar {
    return_from_caller(5);
}

# This prints 5
print foo();

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

sub complex_function {
    my ($x, $y) = @_;
    memoize_self({key => $y, expires_in => '5min'));
    # compute $result
    return $result;
}

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

如果不能从调用方返回,我可能会使用 $_ 并这样写:

return $_ if memoize_self({key => $y, expires_in => '5min'));

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

编辑:给合理建议的人Memoize - 是的,我应该说,我很了解这个模块。我正在写一个基于 CHI 的更现代和更有特色的 Memoize 版本.

但是关于这个问题,在某些情况下,从函数的内部而不是从函数的外部进行内存是有用的(Memoize 只做后者)。它使自定义缓存键和/或确定是否要为这个特定调用完全内存变得容易。例如

sub complex_function {
    my $key = ...;   # normalize arguments
    if (...) {       # is it worth memoizing in this case?
        memoize_self({key => $key});
    }
}

我也喜欢它包裹在函数中的方式,而不是在外面创建自己的行,ala state variables .

最佳答案

Continuation::Escape做你想要的。 Memoize然而,正如 Nikhil 指出的那样,这才是您真正需要的。

关于perl - Perl 中的非本地返回(从调用者返回),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10372150/

相关文章:

perl - 使用 Dist::Zilla dist.ini 如何获得仅用于测试的文件?

perl - 如何从 PDF::Table 获取表格高度?

arrays - 如何使用 Perl 剪切数组中字符串的第二列

xml - 在 xml 中转义 xml 标签

python - 查找模式并打印下一列(两个文件)

arrays - 如何在 Perl 中正确替换哈希数组中的值?

perl - 如何区分未传递的参数和传递错误值的参数?

mysql - Perl - 将日期从 YEAR-MM-DD 转换为 MONTH、DD、YEAR

regex - perl 正则表达式从字符串 : why does it work? 中删除初始全空白行

设置文件权限所需的 perl chmod 帮助