首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Perl中提供了哪种语法糖来减少l/rvalue操作符与if语句的代码?

Perl中提供了哪种语法糖来减少l/rvalue操作符与if语句的代码?
EN

Stack Overflow用户
提问于 2011-10-18 00:08:20
回答 5查看 1.1K关注 0票数 15

由于Perl是一种非常好用的语言,所以有很多这样的语句,但是任何语言中最常用的语句都是if语句和设置值的组合。我想我已经找到了其中的许多,但仍然有一些空白。最终,我们的目标是不需要多次编写变量名:

这是我到目前为止所知道的:

代码语言:javascript
运行
复制
$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,如下所示:

代码语言:javascript
运行
复制
my @part = (
    'http://example.net/app',
    ( 'admin'  ) x!! $is_admin_link,
    ( $subsite ) x!! defined $subsite,
    $mode,
    ( $id      ) x!! defined $id,
    ( $submode ) x!! defined $submode,
);

然而,我发现列表中缺少的是:

代码语言:javascript
运行
复制
$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?

还有什么值得一提的吗?还有哪些条件集变量可以用来减少代码?还遗漏了什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-18 03:42:24

你的问题中的这些结构可以使用low keywords andor关键字更清楚地写出来:

代码语言:javascript
运行
复制
$c and return $r;    # return $r if ($c);
$c or return $r;     # return $r unless ($c);
$c and $r = $s;      # $r = $s if ($c);

andor的优点在于,与语句修饰符控制字不同,andor可以链接到复合表达式中。

语法糖的另一个有用工具是使用for/foreach循环作为单个值的主题化。请考虑以下几点:

代码语言:javascript
运行
复制
$var = $new_value if defined $new_value;

vs

代码语言:javascript
运行
复制
defined and $var = $_ for $new_value;

或者像这样的东西:

代码语言:javascript
运行
复制
$foo = "[$foo]";
$bar = "[$bar]";

$_ = "[$_]" for $foo, $bar;

map函数也可以以这种方式使用,它有一个可以使用的返回值。

票数 8
EN

Stack Overflow用户

发布于 2011-10-18 16:07:05

还有左边的三进制运算符:

代码语言:javascript
运行
复制
$cond ? $var1 : $var2 = "the value";

等同于:

代码语言:javascript
运行
复制
if ($cond) {
    $var1 = "the value";
} else {
    $var2 = "the value";
}
票数 6
EN

Stack Overflow用户

发布于 2011-10-18 01:48:58

$r = $r < $s ? $r : $s;

代码语言:javascript
运行
复制
    $r = $s if $r > $s;

代码语言:javascript
运行
复制
    use List::Util qw( min );

    $r = min($r, $s);

或者:

代码语言:javascript
运行
复制
    sub min_inplace {
       my $min_ref = \shift;
       for (@_) { $$min_ref = $_ if $$min_ref > $_; }
    }

    min_inplace($r, $s);

$r = $s if (defined $s);

代码语言:javascript
运行
复制
    $r = $s // $r;

$r = $t; $r = $s if (defined $s);

代码语言:javascript
运行
复制
    $r = $s // $t;

$r = !$s ? $s : $t;

代码语言:javascript
运行
复制
    $r = $s && $t;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7796470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档