【发布时间】:2011-12-09 10:26:45
【问题描述】:
那里有很多,因为 Perl 是一种非常含糖的语言,但任何语言中最常用的语句是 if 语句和设置值的组合。我想我已经找到了很多,但仍有一些差距。最终,目标是不必多次编写变量名:
这是我目前所拥有的:
$r ||= $s; # $r = $s unless ($r);
$r //= $s; # $r = $s unless (defined $r);
$r &&= $s; # $r = $s if ($r);
$r = $c ? $s : $t; # if ($c) { $r = $s } else { $r = $t }
$c ? $r : $s = $t; # if ($c) { $r = $t } else { $s = $t }
$r = $s || $t; # if ($s) { $r = $s } else { $r = $t }
$r = $s && $t; # if ($s) { $r = $t } else { $r = $s = undef, 0, untrue, etc. }
$c and return $r; # return $r if ($c);
$c or return $r; # return $r unless ($c);
$c and $r = $s; # $r = $s if ($c);
@$r{qw(a b c d)} # ($r->{a}, $r->{b}, $r->{c}, $r->{d})
有人在“秘密操作员”上也有一个really interesting article,如下所示:
my @part = (
'http://example.net/app',
( 'admin' ) x!! $is_admin_link,
( $subsite ) x!! defined $subsite,
$mode,
( $id ) x!! defined $id,
( $submode ) x!! defined $submode,
);
但是,我发现列表中缺少的是:
$r <= $s; # read as "$r = min($r, $s);" except with short-circuiting
$r = $s if (defined $s); # what's the opposite of //?
$r and return $r # can that be done without repeating $r?
还有什么值得补充的吗?还有哪些其他条件集变量可用于减少代码?还缺少什么?
【问题讨论】:
-
$c && $r = $s需要多加一点糖(你不得不说($r=$s)) -
@mob,恐怕这对 OP 来说是相当苦涩的味道 :-)
-
$r = !$s ? $s : $t和$r = $s && $t是一样的 -
min($r, $s)不能短路。必须检查每个元素才能找到最小的元素。 -
@ikegami:是的,但更多的是操作。例如,标准最小值将执行以下操作:读取 $r,读取 $s,放入 $list,循环并找到最小值,存储到 $r。当我需要做的只是:比较 $r 和 $s,STOP 或将 $s 存储在 $r 中。那是短路。
标签: perl logical-operators syntactic-sugar rvalue