作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个带有 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/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!