【发布时间】:2023-03-25 18:39:01
【问题描述】:
参数中的“-”是什么意思
$cgi->start_html(-title => uc($color), -BGCOLOR => $color);
我只知道它用于哈希类型,但这是 sub 中的参数。所以弄得我一头雾水,找了半天。
【问题讨论】:
-
请不要使用CGI,pm如果你有任何选择的话。基于 PSGI/Plack 的东西会让你的生活变得更轻松。
标签: perl
参数中的“-”是什么意思
$cgi->start_html(-title => uc($color), -BGCOLOR => $color);
我只知道它用于哈希类型,但这是 sub 中的参数。所以弄得我一头雾水,找了半天。
【问题讨论】:
标签: perl
每当您在 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
这里有三个区别:
title 和BGCOLOR。=> 运算符更改为逗号。uc($color) 中消失了。前两个是=> ("fat comma")运算符的正常效果:它相当于一个逗号,除了如果左边的东西是一个标识符(以字母或下划线开头并且只包含字母数字字符和下划线),该标识符成为带引号的字符串。
uc 之后的括号在这种情况下并不是绝对必要的,因为内置函数 uc 的原型是接受 0 或 1 个参数。
但是现在我们有了-'title' 和-'BGCOLOR',那么字符串的负数是什么?检查perldoc perlop,我们看到一元减号遵循规则:
'+' 或'-' 开头,则仅将字符串的第一个字符切换为相反的符号。'-'。这里我们有案例 3,所以 -'title' 是 '-title' 和 -'BGCOLOR' 是 '-BGCOLOR'。
所以大概start_html 方法需要一个以键值对形式出现的参数列表,并且键字符串应该以连字符开头。 (它可能会也可能不会在内部使用这些参数来创建一个哈希,比如my %options = @_;。)
这有点绕圈子,而且如果您曾尝试通过 -3zzz => $value 之类的东西,您会得到令人困惑的结果。所以我个人会在这里添加明确的引号,以明确传递的内容,但无论如何都要继续使用粗逗号来强调参数是键/值对:
$cgi->start_html('-title' => uc($color), '-BGCOLOR' => $color);
【讨论】:
这里没有效果。它只是被视为字符串的一部分。我假设 CGI.pm 的原作者想让这些选项看起来更像命令行选项。我认为这是一个糟糕的主意。
【讨论】:
'--quoting' 是行不通的。
它是一个字符串文字,就像“-title”或“-BGCOLOR”一样。
【讨论】:
[Unary
"-"...] 如果操作数是标识符,则返回由与标识符连接的减号组成的字符串。否则,如果字符串以加号或减号开头,则返回以相反符号开头的字符串。
换句话说,-"foo" 是 "-foo"。
=>运算符(有时发音为“fat comma”)是逗号的同义词,除了它会使左侧的单词以字母或下划线开头并且仅由以下内容组成时被解释为字符串字母、数字和下划线。
换句话说,foo => 42 是"foo", 42。
综合起来,这意味着-title => uc($color) 是"-title", uc($color)。
【讨论】: