【问题标题】:Perl :what does "-" means in perlPerl:“-”在 perl 中是什么意思
【发布时间】:2023-03-25 18:39:01
【问题描述】:

参数中的“-”是什么意思

$cgi->start_html(-title => uc($color), -BGCOLOR => $color);

我只知道它用于哈希类型,但这是 sub 中的参数。所以弄得我一头雾水,找了半天。

【问题讨论】:

  • 请不要使用CGI,pm如果你有任何选择的话。基于 PSGI/Plack 的东西会让你的生活变得更轻松。

标签: perl


【解决方案1】:

每当您在 Perl 中遇到令人困惑的语法时,一个方便的工具就是 -MO=Deparse 选项。这会导致 Perl 检查脚本的语法并以规范化的形式输出脚本,而不是执行它。

如果我这样做了

perl -MO=Deparse -e '$cgi->start_html(-title => uc($color), -BGCOLOR => $color);'

我得到以下结果:

$cgi->start_html(-'title', uc $color, -'BGCOLOR', $color);
-e syntax OK

这里有三个区别:

  1. 引用已添加到titleBGCOLOR
  2. => 运算符更改为逗号。
  3. 括号从uc($color) 中消失了。

前两个是=> ("fat comma")运算符的正常效果:它相当于一个逗号,除了如果左边的东西是一个标识符(以字母或下划线开头并且只包含字母数字字符和下划线),该标识符成为带引号的字符串。

uc 之后的括号在这种情况下并不是绝对必要的,因为内置函数 uc 的原型是接受 0 或 1 个参数。

但是现在我们有了-'title'-'BGCOLOR',那么字符串的负数是什么?检查perldoc perlop,我们看到一元减号遵循规则:

  1. 如果操作数是数字或数字的字符串表示形式,则进行算术否定。
  2. 否则,如果字符串以'+''-' 开头,则仅将字符串的第一个字符切换为相反的符号。
  3. 否则,如果字符串以字母开头,则在字符串开头添加'-'
  4. 否则,尝试将字符串转换为数字,如果启用警告,可能会打印警告,然后执行算术否定。

这里我们有案例 3,所以 -'title''-title'-'BGCOLOR''-BGCOLOR'

所以大概start_html 方法需要一个以键值对形式出现的参数列表,并且键字符串应该以连字符开头。 (它可能会也可能不会在内部使用这些参数来创建一个哈希,比如my %options = @_;。)

这有点绕圈子,而且如果您曾尝试通过 -3zzz => $value 之类的东西,您会得到令人困惑的结果。所以我个人会在这里添加明确的引号,以明确传递的内容,但无论如何都要继续使用粗逗号来强调参数是键/值对:

$cgi->start_html('-title' => uc($color), '-BGCOLOR' => $color);

【讨论】:

  • 为什么键字符串以连字符开头?当我使用连字符时?没有连字符的键字符串有什么区别?
  • 没什么。它们只是字符串。
【解决方案2】:

这里没有效果。它只是被视为字符串的一部分。我假设 CGI.pm 的原作者想让这些选项看起来更像命令行选项。我认为这是一个糟糕的主意。

【讨论】:

  • 我同意这不是最好的主意,但它并不少见,其他模块也使用该约定。第一次看到它时,我和 OP 有同样的问题,想知道为什么他们只使用 one 破折号,而不是 two (就像在 --real-long-options )。我认为没有'--quoting' 是行不通的。
  • @PerlDuck:我不认为我使用任何其他使用这种约定的模块(当然,这些天我也不经常使用 CGI.pm)。
【解决方案3】:

它是一个字符串文字,就像“-title”或“-BGCOLOR”一样。

【讨论】:

    【解决方案4】:

    perldoc perlop:

    [Unary "-" ...] 如果操作数是标识符,则返回由与标识符连接的减号组成的字符串。否则,如果字符串以加号或减号开头,则返回以相反符号开头的字符串。

    换句话说,-"foo""-foo"

    => 运算符(有时发音为“fat comma”)是逗号的同义词,除了它会使左侧的单词以字母或下划线开头并且仅由以下内容组成时被解释为字符串字母、数字和下划线。

    换句话说,foo => 42"foo", 42

    综合起来,这意味着-title => uc($color)"-title", uc($color)

    【讨论】:

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