根据我对支持该功能的语言的经验,使用命名参数而不是位置参数调用函数的程序更易于阅读和维护。
我认为 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])
除了将信息转储到 STDOUT 之外,与 tables_report() 相同。
使用位置参数和命名参数调用
如果我按文档顺序传递位置参数,我会得到我期望的输出:
$parser->tables_dump(1, '_') ;
列由下划线而不是默认冒号分隔:
TABLE(0, 0):
a_b_c
1_2_3
4_5_6
在 Perl.com 的Advance Subroutines 文章之后,我尝试传递包含参数名称和值的散列以阐明参数的含义:
$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 => '_'}) ;
我可以使用命名参数样式调用此函数,还是应该只满足于位置?