使用模块中的Perl哈希参数

myk*_*hal 1 perl arguments perl-module

一些Perl模块使用hash参数导入,如:

use Test::Simple tests => 1
Run Code Online (Sandbox Code Playgroud)

这与记录的use使用变体不一致:

use Module VERSION LIST
use Module VERSION
use Module LIST
use Module
use VERSION
Run Code Online (Sandbox Code Playgroud)

从命名模块将一些语义导入当前包,通常通过将某些子例程或变量名称别名到包中.

而在我们的例子中,我们使用哈希而不是列表,至少在语义上 - 当然,

use Test::Simple qw(tests 1)
Run Code Online (Sandbox Code Playgroud)

是等价的,但对于人类局外人来说是没有意义的,他们希望列表是要导入的名称列表.

你如何解释/捍卫这种偏差?是否允许使用参数导入模块是推荐的语法糖?

Sui*_*uic 6

perlop得到

=>运算符是逗号的同义词,除非它使左侧的单词如果以字母或下划线开头并且仅由字母,数字和下划线组成,则将其解释为字符串.这包括可能被解释为运算符,常量,单个数字v字符串或函数调用的操作数.如果对此行为有疑问,可以显式引用左操作数.

否则,根据上下文,=>运算符的行为与逗号运算符或列表参数分隔符完全相同.

所以这是use Module LIST语法

  • @mykhal,如果你知道,我不明白这是什么问题.`tests => 1` =`'test',1` =`qw(test 1)`. (3认同)

ike*_*ami 5

首先,您应该重读您引用的文档.

从命名模块将一些语义导入当前包,通常通过将某些子例程或变量名称别名到包中.

它不仅仅用于导入潜艇列表.


你如何解释/捍卫这种偏差?

你提到了三个偏差.

  1. =>表示哈希的信念.

    这源于误解,即存在散列初始化器这样的事情.解释Perl没有初始化器,=即使它的LHS是%hash或者,也表示普通的赋值my %hash.哈希和数组是变量的类型,而不是数据.

  2. 传递给列表的信念use Test::Simple是要导入的符号列表.

    我不确定这是怎么回事.如果是,您可以将它们引用到Test :: Simple的文档中.

  3. 传递给列表的信念use MODULE是要导入的符号列表.

    有很多反例,包括常用的核心模块严格,警告,CGI,CGI :: Carp和Test :: More.

不应该保护任何偏差.这些都不是有用的比喻.