如何简化Perl中无条件执行多表达式并返回首个结果的代码?
几种简洁写法方案
1. 原生逗号运算符紧凑写法
不需要额外子例程,直接利用Perl的逗号运算符特性——它会按顺序执行所有表达式,最后返回最后一个表达式的值。把临时变量的声明和操作塞进括号里就行:
my $x = (my $r = get-result, do-a-thing-that-would-change-result($r), $r);
这里逗号会依次执行$r赋值、修改操作,最后返回$r,完美匹配你的逻辑。如果操作是直接修改$r的(比如它是引用),写法会更简洁。
2. 自定义tap子例程(类似Ruby的tap方法)
如果觉得上面的临时变量看着碍眼,可以写一个通用的tap函数,专门用来“触碰”值并返回原值:
sub tap { my ($val, $code) = @_; $code->($val); return $val; } # 调用方式 my $x = tap get-result, sub { do-a-thing-that-would-change-result($_[0]) }; # 要是习惯用$_,可以改成: sub tap { local $_ = shift; $_[0]->(); return $_; } # 这样调用更简洁 my $x = tap get-result, sub { do-a-thing-that-would-change-result($_) };
这个子例程可以放在你的工具模块里,每次直接用就行,语义也很清晰——“获取结果,碰它一下(修改),然后返回它”。
3. 用do块的极简写法
如果不想搞花里胡哨的,其实原生do块也能缩成一行,比你原来的写法省几行:
my $x = do { my $r = get-result; do-a-thing-that-would-change-result($r); $r };
虽然还是有临时变量,但胜在不需要额外依赖,一眼就能看懂逻辑。
另外你提到的反转操作符思路,Perl原生确实没有直接支持的方式,因为;是语句分隔符不是运算符,没法被元操作符修改。短路操作符&&/||又会受条件影响,不符合你“无条件执行”的需求,所以上面几种方案是更务实的选择。
内容的提问来源于stack exchange,提问作者darch
相关产品推荐
相关产品推荐

