使用hash参数导入一些Perl模块,如:
use Test::Simple tests => 1
与记录的use
用法变体不一致:
use Module VERSION LIST use Module VERSION use Module LIST use Module use VERSION
将一些语义从命名模块导入当前包,通常是将某些子例程或变量名称别名到包中。
虽然在我们的例子中,我们使用哈希而不是列表,至少在语义上 - 当然,
use Test::Simple qw(tests 1)
是等价的,但对于人类局外人来说没有意义,他们希望列表是要导入的名称列表。
你如何解释/捍卫这种偏差?是否允许使用参数导入模块是推荐的语法糖?
答案 0 :(得分:6)
=> operator是逗号的同义词,除了它导致a 如果它以a开头,则左边的单词被解释为字符串 字母或下划线,仅由字母,数字和字母组成 下划线。这包括可能的操作数 解释为运算符,常量,单数V字符串或 函数调用。如果对此行为有疑问,左操作数可以 明确引用。
否则,=>运算符的行为与逗号运算符完全相同 列表参数分隔符,根据上下文。
所以它是use Module LIST
语法
答案 1 :(得分:5)
首先,您应该重读所引用的文档。
将一些语义从命名模块导入当前包,通常是将某些子例程或变量名称别名到包中。
这不仅仅是为了导入潜艇清单。
你如何解释/捍卫这种偏差?
你提到了三个偏差。
相信=>
表示哈希。
这源于误解,即存在散列初始化器这样的事情。解释Perl没有初始值设定项,=
表示普通赋值,即使它的LHS是%hash
或my %hash
。哈希和数组是变量的类型,而不是数据。
传递给use Test::Simple
的列表是要导入的符号列表。
我不确定这是怎么回事。如果是,可以将它们引用到Test :: Simple的文档中。
传递给use MODULE
的列表是要导入的符号列表。
有很多反例,包括常用的核心模块严格,警告,CGI,CGI :: Carp和Test :: More。
不应对任何偏差进行辩护。这些都不是有用的比喻。
答案 2 :(得分:3)
如您所述,这属于use Module LIST
类别。
我认为理解如何解释LIST
用法的关键是要认识到use Module LIST;
转换为以下行:
BEGIN { require Module; Module->import( LIST ); }
模块出现以将LIST
视为填充哈希的元素,因为相关包具有自定义import
子例程:
sub import {
my($class) = shift;
# Don't run all this when loading ourself.
return 1 if $class eq 'Test::Builder::Module';
my $test = $class->builder;
my $caller = caller;
$test->exported_to($caller);
$class->import_extra( \@_ );
my(@imports) = $class->_strip_imports( \@_ );
$test->plan(@_);
$class->export_to_level( 1, $class, @imports );
}
Test::More
也使用了这种“模式”。
答案 3 :(得分:2)
ikegami做得很好,回答“你如何解释/捍卫这种偏差?” (也就是说,这里 没有偏差)。
回答:“允许使用参数导入模块是否是推荐的语法糖?”
不,通用模块通常应该避免这样做,至少对于配置设置,因为它鼓励在模块控制功能中设计全局变量。这意味着两个独立的其他模块不能使用不同配置的模块。这种滥用的一个例子是Math :: BigInt(和朋友)。
测试模块是一个特例;它们只可能被主脚本使用(或作为主脚本中使用的模块的超类),因此我的异议不适用。
(当然一个模块可能会遇到麻烦,无论是传递给导入的任何东西都有类似pragma的词法范围,还是绑定到特定的调用包,但这两个选项的效果略有不同,你可能会产生错误在它们不同的情况下的期望,以及使同一个呼叫者难以使用多种配置。)
几乎在所有情况下,支持OO接口并将此类设置作为实例属性会好得多。
答案 4 :(得分:-1)
使用此表单use Test::Simple tests => 1
是Perl的常规方式,因为符号=>
与逗号运算符,
相同。因此,语法糖不是另一种做某事的方法。 TIMTOWTDI