gpt4 book ai didi

perl - 将标量/列表上下文传递给被调用的子例程

转载 作者:行者123 更新时间:2023-12-04 16:48:41 24 4
gpt4 key购买 nike

我正在尝试编写一个带有 coderef 参数的子程序。我的 sub 进行一些初始化,调用 coderef,然后进行一些清理。

我需要使用与我的子调用时相同的上下文(标量、列表、空上下文)来调用 coderef。我能想到的唯一方法是这样的:

sub perform {
my ($self, $code) = @_;

# do some initialization...

my @ret;
my $ret;

if (not defined wantarray) {
$code->();
} elsif (wantarray) {
@ret = $code->();
} else {
$ret = $code->();
}

# do some cleanup...

if (not defined wantarray) {
return;
} elsif (wantarray) {
return @ret;
} else {
return $ret;
}
}

显然这段代码中有很多冗余。有什么方法可以减少或消除这种冗余?

编辑 我后来意识到我需要在 eval block 中运行 $code->() 以便清理运行,即使代码死了。添加 eval 支持,并结合 user502515 和 cjm 的建议,这就是我的想法。

sub perform {
my ($self, $code) = @_;

# do some initialization...

my $w = wantarray;
return sub {
my $error = $@;

# do some cleanup...

die $error if $error; # propagate exception
return $w ? @_ : $_[0];
}->(eval { $w ? $code->() : scalar($code->()) });
}

这消除了冗余,但不幸的是现在控制流有点难以遵循。

最佳答案

查看 Contextual::Return CPAN 上的模块。我认为它可以让你做你想做的事(可能还有更多)。

关于perl - 将标量/列表上下文传递给被调用的子例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4294622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com