【发布时间】:2012-11-13 12:19:17
【问题描述】:
根据我对支持该功能的语言的经验,使用命名参数而不是位置参数调用函数的程序更易于阅读和维护。
我认为 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) ;
documentation 表示我可以使用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 的Advance Subroutines article,我尝试传递一个包含参数名称和值的哈希来阐明参数的含义:
$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 => '_'}) ;
我可以使用命名参数样式调用这个函数,还是应该满足于位置?
【问题讨论】:
标签: perl named-parameters