为什么 perl 中 // 的优先级低于 equal 的优先级?

发布于 2024-12-20 20:20:42 字数 254 浏览 0 评论 0原文

为什么在(至少)perl 5.010 中 // 的优先级低于 ==

例如,这

use 5.010;
my $may_be_undefined = 1;
my $is_equal_to_two = ($may_be_undefined//0 == 2);
say $is_equal_to_two;

(对我来说)打印出非常意想不到的结果。

Why does // have lower precedence than == in (at least) perl 5.010?

For example, this

use 5.010;
my $may_be_undefined = 1;
my $is_equal_to_two = ($may_be_undefined//0 == 2);
say $is_equal_to_two;

prints (for me) very unexpected result.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

复古式 2024-12-27 20:20:42

这是因为 // 以及 == 所属的运算符类别。

== 是一个“相等运算符”,尽管 // 属于“C 风格逻辑运算符”类别”。

举个例子; &&// 属于同一“类别”,也就是说,下面的两个语句在涉及到时是等效的运算符优先级。这样可能更容易理解吧?

  print "hello world" if $may_be_undefined && 0 == 2;
  print "hello world" if $may_be_undefined // 0 == 2;

C 风格逻辑定义或的文档 ( // )

尽管 Perl 的 // 运算符在 C 中没有直接等效项,但与其 C 风格的 or 相关。事实上,它与 || 完全相同,只是它测试左侧的定义性而不是其真实性。

因此,$a // $b 类似于 Defined($a) || $b (除了它返回 $a 的值而不是 Defined($a) 的值)并产生与 Defined($a) 相同的结果? $a : $b (除了三元运算符形式可以用作左值,而 $a // $b 则不能)。

这对于为变量提供默认值非常有用。如果您确实想测试是否至少定义了 $a 和 $b 之一,请使用 Defined($a // $b) 。

||、// 和 &&运算符返回最后计算的值(与 C 的 || 和 && 不同,它们返回 0 或 1)。


运算符优先级和关联性的文档

It's because of the category of operators which // falls under, aswell as ==.

== is an "equality operator" though // falls under the category of "C-style logical operators".

As an example; && is in the same "category" as //, with that said both of the statements below are equivalent when it comes to operator precedence. That might make it easier to understand?

  print "hello world" if $may_be_undefined && 0 == 2;
  print "hello world" if $may_be_undefined // 0 == 2;

Documentation of C-style Logical Defined-Or ( // )

Although it has no direct equivalent in C, Perl's // operator is related to its C-style or. In fact, it's exactly the same as ||, except that it tests the left hand side's definedness instead of its truth.

Thus, $a // $b is similar to defined($a) || $b (except that it returns the value of $a rather than the value of defined($a)) and yields the same result as defined($a) ? $a : $b (except that the ternary-operator form can be used as a lvalue, while $a // $b cannot).

This is very useful for providing default values for variables. If you actually want to test if at least one of $a and $b is defined, use defined($a // $b) .

The ||, // and && operators return the last value evaluated (unlike C's || and &&, which return 0 or 1).


Documentation of Operator Precedence and Associativity

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文