1

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

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)

是等效的,但对于期望列表是要导入的名称列表的人类局外人来说没有意义。

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

4

5 回答 5

6

佩洛普

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

否则, => 运算符的行为与逗号运算符或列表参数分隔符完全相同,具体取决于上下文。

所以它的use Module LIST语法

于 2013-10-29T11:40:25.950 回答
5

首先,您应该重新阅读您引用的文档。

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

这不仅仅是为了导入潜艇列表。


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

你提到了三个偏差。

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

    这源于对哈希初始化器之类的误解。说明 Perl 没有初始化器,=即使它的 LHS 是%hashor ,它也表示一个普通的赋值my %hash。哈希和数组是变量的类型,而不是数据。

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

    我不确定这是怎么回事。如果是,您可以将它们参考 Test::Simple 的文档。

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

    反例很多,包括常用的核心模块 strict、warnings、CGI、CGI::Carp 和 Test::More。

不应为任何偏差辩护。这些不是有用的比喻。

于 2013-10-29T14:02:52.113 回答
3

正如您所说,这属于该use Module LIST类别。

我认为理解如何解释 for 的关键LIST是意识到use Module LIST;转换为以下行:

BEGIN { require Module; Module->import( LIST ); }

该模块似乎LISTas 元素视为填充散列,因为相关包具有自定义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也利用了这种“模式”。

于 2013-10-29T12:39:47.707 回答
2

ikegami 很好地回答了“你如何解释/捍卫这种偏差?” (即这里没有偏差)。

回答:“允许使用参数导入模块是推荐的语法糖吗?”

不,通用模块通常应该避免这样做,至少对于配置设置,因为它鼓励在模块控制功能中设计全局变量。这意味着两个独立的其他模块不能使用具有不同配置的模块。这种滥用的一个例子是 Math::BigInt (和朋友)。

测试模块是一种特殊情况;它们只可能被主脚本使用(或作为主脚本中使用的模块的超类),所以我的反对意见不适用。

(当然,模块可能会遇到麻烦,使传递给 import 的任何内容都具有类似编译指示的词法范围或绑定到特定的调用包,但这两个选项在效果上略有不同,并且您可能会在它们不同的情况,以及使同一调用者难以使用多种配置。)

在几乎所有情况下,支持 OO 接口并将此类设置作为实例属性会好得多。

于 2013-10-29T15:05:44.477 回答
-1

使用这种形式use Test::Simple tests => 1是 Perl 的正常方式,因为符号=>与逗号操作符相同,。所以它不是语法糖,它只是另一种做某事的方式。蒂姆托迪

于 2013-10-29T11:41:11.783 回答