在Perl中构造函数的哈希参数?

时间:2016-02-02 05:46:08

标签: perl oop

use PDF::Extract;
$pdf=new PDF::Extract( PDFDoc=>"test.pdf");
$i=1;
$i++ while ( $pdf->savePDFExtract( PDFPages=>$i ) );

我试图理解上面的Perl代码。它似乎是从模块中实例化一个对象。调用构造函数的行中的参数是什么? =>是什么意思?它是一个哈希参数吗?

1 个答案:

答案 0 :(得分:5)

构造函数是通过间接对象语法调用的,不鼓励(通常是旧代码的符号)。最好写成:

my $pdf = PDF::Extract->new(...);

perlobj文档建议您避免使用间接对象语法,原因如下:

  

首先,阅读可能令人困惑。在上面的例子中,它不是   如果saveFile类提供的方法,或者仅仅是{   期望文件对象作为其第一个参数的子例程。

     

与类方法一起使用时,问题更严重。因为Perl   允许子程序名称被写为裸字,Perl必须猜测   方法之后的裸字是类名还是子程序   名称。换句话说,Perl可以将语法解析为   File->new( $path, $data )new( File( $path, $data ) )

要回答你的第二个问题,=>被称为胖逗号,而perlop对此有这样的说法:

  

=>运算符(有时发音为“fat逗号”)是其同义词   逗号除了它导致左边的单词被解释   作为字符串,如果它以字母或下划线开头并组成   只有字母,数字和下划线。这包括操作数   否则可能被解释为运算符,常量,单个数字   v字符串或函数调用。如果对此行为有疑问,请左侧   操作数可以明确引用。

     

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

在您的示例代码中,构造函数接收一个列表,就像您使用了普通的逗号一样。实际上,您的代码等同于:

my $pdf = PDF::Extract->new('PDFDoc', 'test.pdf');

然而,创建哈希的东西是另一方的赋值,可能看起来像这样:

sub new {
    my $class = shift;
    my %args = @_;
    # ...
}

fat逗号不是专门用于散列(也不是初始化散列所必需的,正如我在上面指出的那样),但是你通常会在参数列表中的键/值关联的任何地方看到它。角色的形状清楚地表明“这与此有关”。它还节省了一些引号字符的输入,这是一个很好的附带好处。

相关问题