为啥 Perl CGI 模块使用连字符来开始命名参数?

Posted

技术标签:

【中文标题】为啥 Perl CGI 模块使用连字符来开始命名参数?【英文标题】:Why does the Perl CGI module use hyphens to start named arguments?为什么 Perl CGI 模块使用连字符来开始命名参数? 【发布时间】:2011-05-29 12:50:05 【问题描述】:

我是新手。我的问题是键(类型、过期名称等)之前的“-”代表什么?为什么不直接使用普通的哈希表方式并丢弃连字符呢?

# #!/usr/local/bin/perl -w
use CGI; 
$q = CGI->new; 
print $q->header(-type=>'image/gif',-expires=>'+3d');
$q->param(-name=>'veggie',-value=>'tomato');

【问题讨论】:

【参考方案1】:

作者已经解释了in the documentation。

大多数 CGI.pm 例程接受几个 争论,有时多达 20 个 可选的!为了简化这个 接口,所有例程都使用一个命名的 看起来像的参数调用样式 这个:

打印 $q->header(-type=>'image/gif',-expires=>'+3d');

每个参数名称前面都有一个 短跑。大小写和顺序都不重要 在参数列表中。 -类型,-类型, 和 -TYPE 都是可以接受的。在 事实上,只有第一个参数需要 以破折号开头。如果破折号是 出现在第一个参数 CGI.pm 假设后续的破折号 那些。

几个例程通常被称为 只有一个论点。在这种情况下 这些例程中,您可以提供 没有论据的单一论据 姓名。 header() 恰好是其中之一 这些套路。在这种情况下, 单个参数是文档类型。

打印 $q->header('text/html');

【讨论】:

【参考方案2】:

这只是一种较旧的 perl 参数样式,通常不用于较新的模块。它并没有被完全弃用,它只是一种较旧的样式,基于 Perl 如何允许您在哈希键以破折号开头时不引用它们。

【讨论】:

AFAIR bareword => "value" 表示法并没有永远在 perl 中,并且前面是 -barewords。这就是旧模块使用这种形式的原因。不过我可能错了。【参考方案3】:

见perlop:

如果操作数是标识符,则返回由与标识符连接的减号组成的字符串。否则,如果字符串以加号或减号开头,则返回以相反符号开头的字符串。 这些规则的一个效果是-bareword 等同于字符串"-bareword"。 (强调我的)

【讨论】:

这太酷了。我们能不能让它更“英语化”……比如 -barewood eq "barewood" 和 +barewood eq 什么? 好吧好吧好吧!由于 => 的魔力,我认为这在 CGI::pm 中有效。显然不是,因为这只适用于 \w 字符。【参考方案4】:

我不知道您所说的“普通哈希表方式”是什么意思。 CGI::pm 的实现方式,属性名称(在大多数情况下)需要以'-'开头,大概是为了可以识别它们。

或者换一种说法,CGI::header 用来标识'type'属性所需的hash-key是'-type'。

这就是 CGI.pm 的定义方式。

【讨论】:

那么CGI::new的自定义参数呢,比如: $query = CGI->new( 'dinosaur'=>'barney', 'song'=>'I love你', '朋友'=>[qw/Jessica George Nancy/] ); 这样理解可以吗? “连字符”键是 HTML 的标准标记。自定义键可以....不带连字符? 好吧,我过于简单化了(尽管我确实说过“在大多数情况下”)。 perldoc 说“每个参数名称前面都有一个破折号。参数列表中的大小写和顺序都不重要。-type、-Type 和 -TYPE 都是可以接受的。实际上,只有第一个参数需要以破折号开头。如果第一个参数中出现破折号,CGI.pm 会为后续参数假定破折号。" perldoc 给出了 CGI::new 的示例,但没有对其进行解释。我的结论是 'new' 的行为与其他方法不同:对于 HTML 快捷方式以外的方法,如果第一个参数不以 '-' 开头,它将被视为第一个定义的 value属性,通常是名称。 但是您在标准键和自定义键之间所做的区分是错误的。 perldoc 说“许多例程会对它无法识别的命名参数执行一些有用的操作。例如,您可以通过将它们作为命名参数提供来生成非标准 HTTP 标头字段:”并且以下示例使用 '-' .

以上是关于为啥 Perl CGI 模块使用连字符来开始命名参数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Perl 使用空字符串来表示 boolean false 值?

如何查看perl cgi.pm的版本

无捕获组和命名组

Centos 8 Perl模块位置[重复]

如何在 perl 中读/写命名管道?

使用别名来要求Perl模块