【问题标题】:What does "!$@" mean in Perl?Perl 中的 "!$@" 是什么意思?
【发布时间】:2021-06-22 15:55:38
【问题描述】:

我不知道 Perl。我正在尝试阅读一些我没有编写的 Perl 代码,并且我在这一行被卡了一两天:

use constant RUNTIME => eval "use Time::SoFar qw( runinterval )" || !$@;

我已经拼凑了大部分,但我无法弄清楚最后一点,!$@

这不包含在我读过的任何教程中,也不清楚我应该寻找哪一页文档,因为我不知道任何与它相关的关键字。

网络搜索随机符号没有结果,因为大多数搜索引擎都会忽略它们(显然包括 Stack Overflow 的)。

我也无法将其分解为更简单的组件。我认为$@ 是标量和数组变量的标志,但这显然不是它们在这里的使用方式。单独搜索它们只会给出这些变量印记的结果。

那么,我需要一位专家。在这种情况下,!$@ 是什么意思?

【问题讨论】:

  • perlvar是破译随机符号的页面

标签: perl


【解决方案1】:

虽然它看起来很像一个经过审查的脏话,但它实际上分解为!$@

Perl 有许多具有单字符名称的“特殊变量”;它们还使用指令use English;

启用了更长的名称

你可以在the perlvar page of the perl manual上找到一个列表(应该也可以通过运行perldoc perlvar获得),其中指定$@,英文名称$EVAL_ERROR,为:

最后一个 eval 运算符的 Perl 错误,即最后一个被捕获的异常。对于 eval BLOCK,这要么是运行时错误消息,要么是调用的字符串或引用 die。 eval STRING 表单还可以捕获语法错误和其他编译时异常。

如果没有发生错误,eval 将 $@ 设置为空字符串。

然后将其传递给!,这是“非”运算符,它将$@ 中的字符串视为布尔值。

  • 如果错误字符串为空则为假,“非假”为真,则为“1”
  • 如果错误字符串为空,则为真,“非真”为假,变为“”

【讨论】:

    【解决方案2】:

    ! 是否定运算符 (perlop),$@ 是保存最后抛出的异常的特殊变量 (perlvar#$@)。

    如果use 子句成功执行,常量RUNTIME 将设置为1。否则,它将被设置为空字符串。

    【讨论】:

      【解决方案3】:

      $@ 是一个变量。这是documented in perlvar。它包含最近的evalundef 引发的异常(如果没有)。 ! 只是非运算符。

      【讨论】:

        【解决方案4】:

        它看起来有点像卡通对话诅咒词不是吗?

        一次取一个符号。 ! 是布尔非,所以如果下面的值为 True 它将变为 False,反之亦然。

        $ 开始一个标量值。 $@man perlvar 中找到,它是最后一次eval 调用输出的错误值。

        【讨论】:

          猜你喜欢
          • 2018-03-05
          • 2010-12-28
          • 2023-03-25
          • 2020-05-21
          • 1970-01-01
          • 2011-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多