什么是“$ module =>”在调用子例程“not_in_file_ok”时表示

时间:2016-05-09 05:26:49

标签: perl

#! /usr/bin/perl
use warnings;
use strict;

use Test::More tests => 6;

sub not_in_file_ok {
    my ($filename, %regex)= @_;

    open (my $fh, '<',  $filename)
            or die "couldn't open $filename for reading: $!";

    my %violated;

    while (my $line = <$fh>) {
        while ( my ($desc, $regex) = each %regex ) {
            if ( $line =~ $regex ) {
                push @{$violated{$desc}||=[] }, $.;
            }
        }
    }

    if ( %violated ) {
        fail("$filename contains boilerplate test");
        diag "$_ appears on lines @{$violated{$_}}" for  keys %violated;
    }
    else {
        pass ("$filename contains no boilerplate test");
    }
}

现在开始调用上面的函数

sub module_boilerplate_ok  {
    my ($module ) = @_;

    not_in_file_ok ( $module =>
        'the great new $MODULENAME'    => qr/- The great new/,
        'boilerplate description'      => qr/Quick Summary of what themodule/,
        'stub function definition'     => qr/function[12]/,
    );
 }

我的问题是第一个参数应该是子程序not_in_file_ok的“文件”。 $module =>可以代表一个文件吗?我认为$module =>似乎是哈希的关键,因为它使用的是=>。谁能帮我理解参数?

2 个答案:

答案 0 :(得分:2)

FlinkKafkaConsumer09运算符称为 fat逗号,基本上是逗号。它具有额外的功能,如果它的左手参数是&#34;裸字&#34; (完全由ASCII字母和数字以及下划线组成)然后它将被隐式引用,例如=>field1 => 99相同,但在这种情况下不适用,因为{{ 1}}不是一个赤字。它还暗示了它的左右参数之间的某种关系,这就是为什么它经常用于哈希初始化以分离哈希元素的键和值

记录在perldoc perlop

您的代码与此相同

'field1', 99

在我看来应该这样写。 $module在这里没有任何优势,似乎作者试图变得聪明

答案 1 :(得分:0)

=>胖逗号。它基本上是编写,的另一种方式,但使用它会使得逗号分隔列表对读者来说更加明显。比较这些:

%a = (
    a => 1,
    b => 2,
    c => 3,
);
%b = ("a", 1, "b", 2, "c", 3,);

胖逗号=>的左侧被假定为文本。

我将您的子通话编写为

not_in_file_ok ( $module,
 'the great new $MODULENAME'    => qr /- The great new/,
  'boilerplate description'     => qr /Quick Summary of what themodule/,
  'stub function definition'     => qr /function[12]/,
);

在视觉上将$module参数与剩余列表分开。

这是有效的,因为Perl哈希可以转换为列表(数组)并返回任何

@array1 = %hash1;
%hash2 = @array1;

散列的列表/数组表示只是键和值的列表:key1,value1,key2,value2等。这就是你作为参数传递给sub的内容。

sub的第一行接受一个参数(into $filename)并从剩余的参数中创建一个散列:

    my ($filename, %regex)= @_;

第二行尝试打开第一个参数:

    open (my $fh, '<',  $filename)

我认为它应该是一个文件名。无论它被称为$module还是后面都是胖或稀/普通逗号。

有关详细信息,请参阅http://perldoc.perl.org/perlop.html#Comma-Operator