根据我使用支持该功能的语言的经验,使用命名参数而不是位置参数调用函数的程序更易于阅读和维护。
我认为Perl有这个功能,但它对我不起作用。
这是我使用的软件包的怪癖,还是我做错了?
设置函数调用
我的第一个Perl项目是使用HTML::TableExtract软件包从HTML标记中提取表格数据并将其显示为文本。
以下代码设置了解析器:
use strict;
use warnings;
use HTML::TableExtract;
my $markup = <<MARKUP;
<table>
<tr> <th>a</th> <th>b</th> <th>c</th> </tr>
<tr> <td>1</td> <td>2</td> <td>3</td> </tr>
<tr> <td>4</td> <td>5</td> <td>6</td> </tr>
</table>
MARKUP
my $parser = HTML::TableExtract->new() ;
$parser->parse($markup) ;
文档中说我可以使用tables_dump
方法将输出转储到命令提示符中,并使用参数$show_content
和$col_sep
来控制输出格式:
tables_report([$show_content, $col_sep])
返回一个字符串,其中包括提取的表格的摘要、深度和计数。可选地使用$show_content标志,该标志会将每个表格的提取内容转储出来,并使用$col_sep分隔列。默认的$col_sep是“:”。
tables_dump([$show_content, $col_sep])
与tables_report()相同,只是将信息转储到STDOUT。
使用位置和名称参数进行调用
如果按照文档顺序传递位置参数,则会得到预期的输出:
$parser->tables_dump(1, '_') ;
列之间用下划线分隔而不是默认的冒号:
TABLE(0, 0):
a_b_c
1_2_3
4_5_6
在Perl.com的高级子程序文章之后,我尝试传递一个包含参数名称和值的哈希表,以澄清参数的含义:
$parser->tables_dump({show_content => 1, col_sep => '_'}) ;
Perl 不理解这个。它忽略了 col_sep
的值并输出默认值:
TABLE(0, 0):
a:b:c
1:2:3
4:5:6
如果我不尝试改变分隔符,我会得到相同的输出:
$parser->tables_dump({show_content => 1}) ;
即使我指定无意义的参数名称,我仍然会得到相同的输出:
$parser->tables_dump({tweedledum => 1, tweedledee => '_'}) ;
我可以使用命名参数风格来调用这个函数吗,还是只能使用位置参数?