Perl:如何将下拉转换为哈希?

时间:2012-12-17 14:36:37

标签: perl hash

我通常将哈希转换为下拉。但是这一次,我想做相反的事情。有谁知道如何使用正则表达式?或任何其他方式。请注意,下拉列表包含optgroup和options。我只想要这个选项,这样id就是哈希的关键,而下拉的值就是哈希的值。

示例如果我们有一个下拉如下:

<select>
<optgroup label=fruits>
<option id=1>Apple</option>
<option id=2>Orange</option>
<option id=3>Pineapple</option>
<optgroup label=stuff>
<option id=4>Chair</option>
<option id=5>Board</option>
</select>

我希望它是

1=> "apple", 2=>"Orange",3=>"Pineapple",4=>"Chair", 5=>"Board"

2 个答案:

答案 0 :(得分:3)

您没有解释select元素的来源,但我认为它是完整HTML文档的一部分?

最好使用 HTML::TreeBuilder,它将构建HTML页面的树结构,并允许您浏览它。

所有这个程序都会找到页面中第一个option语句的所有select个后代,并使用id属性和文本值作为键和值来构建哈希值。每一对。

我仅使用Data::Dump来演示最终哈希的内容。

use strict;
use warnings;

use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new_from_content(<<'END');

<select>
<optgroup label=fruits>
<option id=1>Apple</option>
<option id=2>Orange</option>
<option id=3>Pineapple</option>
<optgroup label=stuff>
<option id=4>Chair</option>
<option id=5>Board</option>
</select>

END

my $select = $tree->look_down(_tag => 'select');

my %data = map { $_->id => $_->as_trimmed_text } $select->look_down(_tag => 'option');

use Data::Dump;
dd \%data;

<强>输出

{ 1 => "Apple", 2 => "Orange", 3 => "Pineapple", 4 => "Chair", 5 => "Board" }

答案 1 :(得分:1)

我建议你留意Ben Jackson关于用正则表达式解析HTML的警告。

但是,有时您需要快速而肮脏的解决方案。你可以这样做:

use warnings;
use strict;

my %options;
while (<DATA>)
{
    if (/^<option\s+id=(\d+)>([\w\s]+)/)
    {
        $options{$1} = $2;  
    }   
}

print "$_: $options{$_}\n" for (keys %options);

__DATA__
<select>
<optgroup label=fruits>
<option id=1>Apple</option>
<option id=2>Orange</option>
<option id=3>Pineapple</option>
<optgroup label=stuff>
<option id=4>Chair</option>
<option id=5>Board</option>
</select>

这会产生各种假设,例如:选项标签中永远不会有其他属性,它始终位于一行的开头,选项ID对整个文件是唯一的,等等。

如果您的输入是可预测的,那么您可以做出类似的假设,这应该可以正常工作。但是,如果您需要“通用”解决方案,请不要使用正则表达式。