perl - Perl 中有哪些语法糖可以减少 l/rvalue 运算符与 if 语句的代码?

标签 perl logical-operators syntactic-sugar rvalue

那里有很多,因为 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在“ secret 运算符(operator)”上,如下所示:
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?

还有什么值得添加的吗?还有哪些条件集变量可用于减少代码?还缺少什么?

最佳答案

使用低优先级 and 可以更清楚地写出您问题中的这些结构。和 or关键词:

$c and return $r;    # return $r if ($c);
$c or return $r;     # return $r unless ($c);
$c and $r = $s;      # $r = $s if ($c);

关于 and 的好处和 or与语句修饰符控制字不同的是,andor可以链接成复合表达式。

另一个有用的语法糖工具是使用 for/foreach作为单个值的主题化器循环。考虑以下:
$var = $new_value if defined $new_value;

对比
defined and $var = $_ for $new_value;

或类似的东西:
$foo = "[$foo]";
$bar = "[$bar]";

$_ = "[$_]" for $foo, $bar;
map函数也可以以这种方式使用,并且有一个可以使用的返回值。

关于perl - Perl 中有哪些语法糖可以减少 l/rvalue 运算符与 if 语句的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7796470/

相关文章:

python - 在Python中的方法调用中选择设置一些类属性的便捷方法

json - 在现有 json 元素中添加新的键值对

Perl Tk Bind <Return> 不是 Number Pad 返回吗?

ruby - Ruby 中的 "and"、 "or"运算符背后有什么智慧吗?

php - 逻辑运算符 - PHP 中的 'or' 与 '||'(双管道)

c++ - (4 > y > 1) 是 C++ 中的有效语句吗?如果是,你如何评价?

c# - 您见过的最好或最有趣的扩展方法用法是什么?

javascript - 如何将 perl 哈希转换为 javascript 哈希

linux - 命令行 : search and replace in all filenames matched by grep

c# - Form.BeginInvoke 有缩写吗?